Fix #1563: Corrupt token when an object macro miscalls a function macro
diff --git a/Test/baseResults/cppBad.vert.out b/Test/baseResults/cppBad.vert.out
index 1a2286a..a5267ff 100644
--- a/Test/baseResults/cppBad.vert.out
+++ b/Test/baseResults/cppBad.vert.out
@@ -10,6 +10,7 @@
Shader version: 100
ERROR: node is still EOpNull!
0:? Linker Objects
+0:? 'n' ( global highp int)
Linked vertex stage:
@@ -19,4 +20,5 @@
Shader version: 100
ERROR: node is still EOpNull!
0:? Linker Objects
+0:? 'n' ( global highp int)
diff --git a/Test/baseResults/cppSimple.vert.out b/Test/baseResults/cppSimple.vert.out
index 90d17ce..85beb4e 100644
--- a/Test/baseResults/cppSimple.vert.out
+++ b/Test/baseResults/cppSimple.vert.out
@@ -77,7 +77,7 @@
ERROR: 12:9002: '#if' : unexpected tokens following directive
ERROR: 12:9014: 'FOOOM' : undeclared identifier
ERROR: 12:9014: '=' : cannot convert from ' temp float' to ' global int'
-ERROR: 12:9016: 'preprocessor evaluation' : can't evaluate expression
+ERROR: 12:9015: 'preprocessor evaluation' : can't evaluate expression
ERROR: 12:9016: 'preprocessor evaluation' : bad expression
ERROR: 12:9500: 'preprocessor evaluation' : bad expression
ERROR: 12:9500: '#if' : unexpected tokens following directive
diff --git a/Test/baseResults/preprocessor.simple.vert.out b/Test/baseResults/preprocessor.simple.vert.out
index 0c37673..57b020c 100644
--- a/Test/baseResults/preprocessor.simple.vert.out
+++ b/Test/baseResults/preprocessor.simple.vert.out
@@ -55,6 +55,12 @@
s . member2 . yyz;
s . member2 . xxyz();
s . member2 . yzy;
- vec3 a = vec3(0);vec3 b = a . zxyz;vec3 b = a . xxyz;vec3 b = a . yyz;vec3 b = a . xxyz();vec3 b = a .;vec3 b = a . z;
+ vec3 a = vec3(0);vec3 b = a . zxyz;vec3 b = a . xxyz;vec3 b = a . yyz;vec3 b = a . xxyz();vec3 b = a . yzy;vec3 b = a . z;
+
+
+ yyz;
+ yzy
+
+
}
diff --git a/Test/preprocessor.simple.vert b/Test/preprocessor.simple.vert
index 2959720..788df76 100755
--- a/Test/preprocessor.simple.vert
+++ b/Test/preprocessor.simple.vert
@@ -37,7 +37,7 @@
#define xyz xxyz
#define yzy() yyz
-#define LIGHTING_COMMON_BRDF() \
+#define FUN_MAC() \
vec3 a = vec3(0); \
vec3 b = a.zxyz; \
vec3 b = a.xyz; \
@@ -55,5 +55,11 @@
s.member2.yzy();
s.member2.xyz();
s.member2.yzy;
- LIGHTING_COMMON_BRDF()
+ FUN_MAC()
+ yzy
+
+ ();
+ yzy
+
+
}
diff --git a/glslang/MachineIndependent/preprocessor/Pp.cpp b/glslang/MachineIndependent/preprocessor/Pp.cpp
old mode 100644
new mode 100755
index c8def98..2000b77
--- a/glslang/MachineIndependent/preprocessor/Pp.cpp
+++ b/glslang/MachineIndependent/preprocessor/Pp.cpp
@@ -1192,14 +1192,19 @@
TSourceLoc loc = ppToken->loc; // in case we go to the next line before discovering the error
in->mac = macro;
if (macro->functionLike) {
- int token = scanToken(ppToken);
+ // We don't know yet if this will be a successful call of a
+ // function-like macro; need to look for a '(', but without trashing
+ // the passed in ppToken, until we know we are no longer speculative.
+ TPpToken parenToken;
+ int token = scanToken(&parenToken);
if (newLineOkay) {
while (token == '\n')
- token = scanToken(ppToken);
+ token = scanToken(&parenToken);
}
if (token != '(') {
- // function-like macro called with object-like syntax: okay, don't expand
- UngetToken(token, ppToken);
+ // Function-like macro called with object-like syntax: okay, don't expand.
+ // (We ate exactly one token that might not be white space; put it back.
+ UngetToken(token, &parenToken);
delete in;
return MacroExpandNotStarted;
}