Fix syntax error when preprocessor macros are defined inside of enum lists
Fixes SF Bug 428, Patch 333
This commit is contained in:
parent
2a3e687c19
commit
857e447654
5 changed files with 220 additions and 22 deletions
|
|
@ -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.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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 \
|
||||||
|
|
|
||||||
92
Examples/test-suite/enum_macro.i
Normal file
92
Examples/test-suite/enum_macro.i
Normal 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
|
||||||
|
};
|
||||||
|
|
||||||
93
Examples/test-suite/java/enum_macro_runme.java
Normal file
93
Examples/test-suite/java/enum_macro_runme.java
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue