From 88e22a60904af24ae009f7a8f99580f15a17cd69 Mon Sep 17 00:00:00 2001 From: John Kessenich <cepheus@frii.com> Date: Thu, 2 Nov 2017 06:48:32 -0600 Subject: [PATCH] Fix #1079: don't give error when macro() name used without open (. --- Test/baseResults/cppBad.vert.out | 3 +- Test/baseResults/cppPassMacroName.frag.out | 67 +++++++++++++++++++ Test/baseResults/cppSimple.vert.out | 4 +- Test/cppPassMacroName.frag | 12 ++++ .../MachineIndependent/preprocessor/Pp.cpp | 4 +- gtests/AST.FromFile.cpp | 1 + 6 files changed, 83 insertions(+), 8 deletions(-) create mode 100755 Test/baseResults/cppPassMacroName.frag.out create mode 100644 Test/cppPassMacroName.frag diff --git a/Test/baseResults/cppBad.vert.out b/Test/baseResults/cppBad.vert.out index 205c29b5b..1a2286aa9 100755 --- a/Test/baseResults/cppBad.vert.out +++ b/Test/baseResults/cppBad.vert.out @@ -2,10 +2,9 @@ cppBad.vert ERROR: 0:2: 'preprocessor evaluation' : bad expression ERROR: 0:2: '#if' : unexpected tokens following directive ERROR: 0:5: 'string' : End of line in string -ERROR: 0:5: 'macro expansion' : expected '(' following n ERROR: 0:5: '""' : string literals not supported ERROR: 0:5: '' : syntax error, unexpected INT, expecting COMMA or SEMICOLON -ERROR: 6 compilation errors. No code generated. +ERROR: 5 compilation errors. No code generated. Shader version: 100 diff --git a/Test/baseResults/cppPassMacroName.frag.out b/Test/baseResults/cppPassMacroName.frag.out new file mode 100755 index 000000000..d8459b3bc --- /dev/null +++ b/Test/baseResults/cppPassMacroName.frag.out @@ -0,0 +1,67 @@ +cppPassMacroName.frag +Shader version: 100 +0:? Sequence +0:5 Function Definition: main( ( global void) +0:5 Function Parameters: +0:7 Sequence +0:7 Sequence +0:7 move second child to first child ( temp mediump int) +0:7 'f1' ( temp mediump int) +0:7 Constant: +0:7 4 (const int) +0:8 Sequence +0:8 move second child to first child ( temp mediump int) +0:8 'f2' ( temp mediump int) +0:8 'f1' ( temp mediump int) +0:9 Sequence +0:9 move second child to first child ( temp mediump int) +0:9 'f3' ( temp mediump int) +0:9 Constant: +0:9 9 (const int) +0:10 Sequence +0:10 move second child to first child ( temp mediump int) +0:10 'f4' ( temp mediump int) +0:10 Constant: +0:10 1 (const int) +0:11 Sequence +0:11 move second child to first child ( temp mediump int) +0:11 'f5' ( temp mediump int) +0:11 Constant: +0:11 5 (const int) +0:? Linker Objects + + +Linked fragment stage: + + +Shader version: 100 +0:? Sequence +0:5 Function Definition: main( ( global void) +0:5 Function Parameters: +0:7 Sequence +0:7 Sequence +0:7 move second child to first child ( temp mediump int) +0:7 'f1' ( temp mediump int) +0:7 Constant: +0:7 4 (const int) +0:8 Sequence +0:8 move second child to first child ( temp mediump int) +0:8 'f2' ( temp mediump int) +0:8 'f1' ( temp mediump int) +0:9 Sequence +0:9 move second child to first child ( temp mediump int) +0:9 'f3' ( temp mediump int) +0:9 Constant: +0:9 9 (const int) +0:10 Sequence +0:10 move second child to first child ( temp mediump int) +0:10 'f4' ( temp mediump int) +0:10 Constant: +0:10 1 (const int) +0:11 Sequence +0:11 move second child to first child ( temp mediump int) +0:11 'f5' ( temp mediump int) +0:11 Constant: +0:11 5 (const int) +0:? Linker Objects + diff --git a/Test/baseResults/cppSimple.vert.out b/Test/baseResults/cppSimple.vert.out index 1b6e6b50d..edb0c3378 100644 --- a/Test/baseResults/cppSimple.vert.out +++ b/Test/baseResults/cppSimple.vert.out @@ -75,10 +75,8 @@ ERROR: 12:20051: '#error' : good evaluation 1 ERROR: 12:20055: '#error' : good evaluation 2 ERROR: 12:9000: 'preprocessor evaluation' : expected ')' ERROR: 12:9002: '#if' : unexpected tokens following directive -ERROR: 12:9014: 'macro expansion' : expected '(' following FOOOM ERROR: 12:9014: 'FOOOM' : undeclared identifier ERROR: 12:9014: '=' : cannot convert from ' temp float' to ' global int' -ERROR: 12:9015: 'macro expansion' : expected '(' following FOOOM ERROR: 12:9016: 'preprocessor evaluation' : can't evaluate expression ERROR: 12:9016: 'preprocessor evaluation' : bad expression ERROR: 12:9500: 'preprocessor evaluation' : bad expression @@ -93,7 +91,7 @@ ERROR: 12:9508: '#error' : \ 377 ERROR: 12:9602: 'defined' : cannot use in preprocessor expression when expanded from macros ERROR: 12:9603: '#error' : DEF_DEFINED then ERROR: 12:10002: '' : missing #endif -ERROR: 90 compilation errors. No code generated. +ERROR: 88 compilation errors. No code generated. Shader version: 400 diff --git a/Test/cppPassMacroName.frag b/Test/cppPassMacroName.frag new file mode 100644 index 000000000..f42d9de6d --- /dev/null +++ b/Test/cppPassMacroName.frag @@ -0,0 +1,12 @@ +#define f1(i) ((i)*(i)) +#define I2(f, n) f(n) + f(n+1) +#define I3(f, n) I2(f, n) + f(n+2) + +void main() +{ + int f1 = 4; + int f2 = f1; + int f3 = f1(3); + int f4 = I2(f1, 0); + int f5 = I3(f1, 0); +} diff --git a/glslang/MachineIndependent/preprocessor/Pp.cpp b/glslang/MachineIndependent/preprocessor/Pp.cpp index aeb42a09a..3ae711c86 100644 --- a/glslang/MachineIndependent/preprocessor/Pp.cpp +++ b/glslang/MachineIndependent/preprocessor/Pp.cpp @@ -1157,7 +1157,6 @@ int TPpContext::MacroExpand(TPpToken* ppToken, bool expandUndef, bool newLineOka } MacroSymbol* macro = macroAtom == 0 ? nullptr : lookupMacroDef(macroAtom); - int token; int depth = 0; // no recursive expansions @@ -1179,13 +1178,12 @@ int TPpContext::MacroExpand(TPpToken* ppToken, bool expandUndef, bool newLineOka TSourceLoc loc = ppToken->loc; // in case we go to the next line before discovering the error in->mac = macro; if (macro->args.size() > 0 || macro->emptyArgs) { - token = scanToken(ppToken); + int token = scanToken(ppToken); if (newLineOkay) { while (token == '\n') token = scanToken(ppToken); } if (token != '(') { - parseContext.ppError(loc, "expected '(' following", "macro expansion", atomStrings.getString(macroAtom)); UngetToken(token, ppToken); delete in; return 0; diff --git a/gtests/AST.FromFile.cpp b/gtests/AST.FromFile.cpp index 7d77825e0..5f6de4f6d 100644 --- a/gtests/AST.FromFile.cpp +++ b/gtests/AST.FromFile.cpp @@ -84,6 +84,7 @@ INSTANTIATE_TEST_CASE_P( "cppBad2.vert", "cppComplexExpr.vert", "cppDeepNest.frag", + "cppPassMacroName.frag", "badChars.frag", "pointCoord.frag", "array.frag", -- GitLab