From 4207c97b938078818140edad101a032cf768191b Mon Sep 17 00:00:00 2001 From: John Kessenich Date: Wed, 7 Nov 2018 18:25:56 -0700 Subject: [PATCH] Fix #1563: Corrupt token when an object macro miscalls a function macro --- Test/baseResults/cppBad.vert.out | 2 ++ Test/baseResults/cppSimple.vert.out | 2 +- Test/baseResults/preprocessor.simple.vert.out | 8 +++++++- Test/preprocessor.simple.vert | 10 ++++++++-- glslang/MachineIndependent/preprocessor/Pp.cpp | 13 +++++++++---- 5 files changed, 27 insertions(+), 8 deletions(-) mode change 100644 => 100755 glslang/MachineIndependent/preprocessor/Pp.cpp 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 @@ 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) 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: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 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 @@ 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 + + } 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 @@ struct S { #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 @@ void foo() 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 @@ 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; } -- 2.7.4