Fix #1563: Corrupt token when an object macro miscalls a function macro
authorJohn Kessenich <cepheus@frii.com>
Thu, 8 Nov 2018 01:25:56 +0000 (18:25 -0700)
committerJohn Kessenich <cepheus@frii.com>
Thu, 8 Nov 2018 01:25:56 +0000 (18:25 -0700)
Test/baseResults/cppBad.vert.out
Test/baseResults/cppSimple.vert.out
Test/baseResults/preprocessor.simple.vert.out
Test/preprocessor.simple.vert
glslang/MachineIndependent/preprocessor/Pp.cpp [changed mode: 0644->0755]

index 1a2286a..a5267ff 100644 (file)
@@ -10,6 +10,7 @@ ERROR: 5 compilation errors.  No code generated.
 Shader version: 100
 ERROR: node is still EOpNull!
 0:?   Linker Objects
+0:?     'n' ( global highp int)
 
 
 Linked vertex stage:
@@ -19,4 +20,5 @@ ERROR: Linking vertex stage: Missing entry point: Each stage requires one entry
 Shader version: 100
 ERROR: node is still EOpNull!
 0:?   Linker Objects
+0:?     'n' ( global highp int)
 
index 90d17ce..85beb4e 100644 (file)
@@ -77,7 +77,7 @@ ERROR: 12:9000: 'preprocessor evaluation' : expected ')'
 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 
index 0c37673..57b020c 100644 (file)
@@ -55,6 +55,12 @@ void foo()
     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
+
+
 }
 
index 2959720..788df76 100755 (executable)
@@ -37,7 +37,7 @@ struct S {
 #define xyz xxyz\r
 #define yzy() yyz\r
 \r
-#define LIGHTING_COMMON_BRDF() \\r
+#define FUN_MAC() \\r
        vec3 a = vec3(0); \\r
        vec3 b = a.zxyz;  \\r
        vec3 b = a.xyz;   \\r
@@ -55,5 +55,11 @@ void foo()
     s.member2.yzy();\r
     s.member2.xyz();\r
     s.member2.yzy;\r
-       LIGHTING_COMMON_BRDF()\r
+    FUN_MAC()\r
+    yzy\r
+\r
+    ();\r
+    yzy\r
+\r
+\r
 }\r
old mode 100644 (file)
new mode 100755 (executable)
index c8def98..2000b77
@@ -1192,14 +1192,19 @@ MacroExpandResult TPpContext::MacroExpand(TPpToken* ppToken, bool expandUndef, b
     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;
         }