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;
         }