Fix syntax error when preprocessor macros are defined inside of enum lists

Fixes SF Bug 428, Patch 333
This commit is contained in:
William S Fulton 2013-04-18 22:47:41 +01:00
commit 857e447654
5 changed files with 220 additions and 22 deletions

View file

@ -5,6 +5,16 @@ See the RELEASENOTES file for a summary of changes in each release.
Version 2.0.10 (in progress) Version 2.0.10 (in progress)
============================ ============================
2013-04-18: wsfulton
Fix SF Bug #428 - Syntax error when preprocessor macros are defined inside of enum lists, such as:
typedef enum {
eZero = 0
#define ONE 1
} EFoo;
The macros are silently ignored.
2013-04-17: wsfulton 2013-04-17: wsfulton
[C#] Pull patch #34 from BrantKyser to fix smart pointers in conjuction with directors. [C#] Pull patch #34 from BrantKyser to fix smart pointers in conjuction with directors.

View file

@ -514,6 +514,7 @@ C_TEST_CASES += \
empty \ empty \
enums \ enums \
enum_forward \ enum_forward \
enum_macro \
extern_declaration \ extern_declaration \
funcptr \ funcptr \
function_typedef \ function_typedef \

View file

@ -0,0 +1,92 @@
%module enum_macro
%inline %{
enum Greeks1
{
#define GREEK1 -1
alpha1=1,
beta1,
theta1
};
enum Greeks2
{
alpha2 = 2,
#define GREEK2 -2
beta2,
theta2
};
enum Greeks3
{
alpha3,
beta3,
#define GREEK3 -3
theta3
};
enum Greeks4
{
alpha4 = 4,
beta4 = 5,
theta4 = 6
#define GREEK4 -4
};
enum Greeks5
{
#define GREEK5 -5
alpha5,
beta5,
};
enum Greeks6
{
alpha6,
#define GREEK6 -6
beta6,
};
enum Greeks7
{
alpha7,
beta7,
#define GREEK7 -7
};
enum Greeks8
{
#define GREEK8 -8
theta8
};
enum Greeks9
{
theta9
#define GREEK9 -9
};
enum Greeks10
{
#define GREEK10 -10
theta10,
};
enum Greeks11
{
theta11,
#define GREEK11 -11
};
typedef enum {
theta12 = 0
#define GREEK12 -12
} Greeks12;
%}
enum Greeks13
{
#define GREEK13 -13
};

View file

@ -0,0 +1,93 @@
import enum_macro.*;
public class enum_macro_runme {
static {
try {
System.loadLibrary("enum_macro");
} catch (UnsatisfiedLinkError e) {
System.err.println("Native code library failed to load. See the chapter on Dynamic Linking Problems in the SWIG Java documentation for help.\n" + e);
System.exit(1);
}
}
public static void main(String argv[])
{
{
Greeks1 a = Greeks1.alpha1;
a = Greeks1.beta1;
a = Greeks1.theta1;
if (a.swigValue() != 3)
throw new RuntimeException("Greeks1");
}
{
Greeks2 a = Greeks2.alpha2;
a = Greeks2.beta2;
a = Greeks2.theta2;
if (a.swigValue() != 4)
throw new RuntimeException("Greeks2");
}
{
Greeks3 a = Greeks3.alpha3;
a = Greeks3.beta3;
a = Greeks3.theta3;
if (a.swigValue() != 2)
throw new RuntimeException("Greeks3");
}
{
Greeks4 a = Greeks4.alpha4;
a = Greeks4.beta4;
a = Greeks4.theta4;
if (a.swigValue() != 6)
throw new RuntimeException("Greeks4");
}
{
Greeks5 a = Greeks5.alpha5;
a = Greeks5.beta5;
if (a.swigValue() != 1)
throw new RuntimeException("Greeks5");
}
{
Greeks6 a = Greeks6.alpha6;
a = Greeks6.beta6;
if (a.swigValue() != 1)
throw new RuntimeException("Greeks6");
}
{
Greeks7 a = Greeks7.alpha7;
a = Greeks7.beta7;
if (a.swigValue() != 1)
throw new RuntimeException("Greeks7");
}
{
Greeks8 a = Greeks8.theta8;
if (a.swigValue() != 0)
throw new RuntimeException("Greeks8");
}
{
Greeks9 a = Greeks9.theta9;
if (a.swigValue() != 0)
throw new RuntimeException("Greeks9");
}
{
Greeks10 a = Greeks10.theta10;
if (a.swigValue() != 0)
throw new RuntimeException("Greeks10");
}
{
Greeks11 a = Greeks11.theta11;
if (a.swigValue() != 0)
throw new RuntimeException("Greeks11");
}
{
Greeks12 a = Greeks12.theta12;
if (a.swigValue() != 0)
throw new RuntimeException("Greeks12");
}
{
Greeks13 a = null;
}
}
}

View file

@ -1788,6 +1788,7 @@ static void tag_nodes(Node *n, const_String_or_char_ptr attrname, DOH *value) {
%type <ptype> type_specifier primitive_type_list ; %type <ptype> type_specifier primitive_type_list ;
%type <node> fname stringtype; %type <node> fname stringtype;
%type <node> featattr; %type <node> featattr;
%type <node> optional_constant_directive;
%% %%
@ -5647,29 +5648,31 @@ definetype : { /* scanner_check_typedef(); */ } expr {
/* Some stuff for handling enums */ /* Some stuff for handling enums */
ename : ID { $$ = $1; } ename : ID { $$ = $1; }
| empty { $$ = (char *) 0;} | empty { $$ = (char *) 0;}
; ;
enumlist : enumlist COMMA edecl { optional_constant_directive : constant_directive { $$ = $1; }
| empty { $$ = 0; }
;
/* Ignore if there is a trailing comma in the enum list */ /* Enum lists - any #define macros (constant directives) within the enum list are ignored. Trailing commas accepted. */
if ($3) { enumlist : enumlist COMMA optional_constant_directive edecl optional_constant_directive {
Node *leftSibling = Getattr($1,"_last"); Node *leftSibling = Getattr($1,"_last");
if (!leftSibling) { set_nextSibling(leftSibling,$4);
leftSibling=$1; Setattr($1,"_last",$4);
} $$ = $1;
set_nextSibling(leftSibling,$3); }
Setattr($1,"_last",$3); | enumlist COMMA optional_constant_directive {
} $$ = $1;
$$ = $1; }
} | optional_constant_directive edecl optional_constant_directive {
| edecl { Setattr($2,"_last",$2);
$$ = $1; $$ = $2;
if ($1) { }
Setattr($1,"_last",$1); | optional_constant_directive {
} $$ = 0;
} }
; ;
edecl : ID { edecl : ID {
SwigType *type = NewSwigType(T_INT); SwigType *type = NewSwigType(T_INT);
@ -5689,7 +5692,6 @@ edecl : ID {
Setattr($$,"value",$1); Setattr($$,"value",$1);
Delete(type); Delete(type);
} }
| empty { $$ = 0; }
; ;
etype : expr { etype : expr {