diff --git a/Test/baseResults/cppBad2.vert.out b/Test/baseResults/cppBad2.vert.out index af9ff386..0398e5e4 100644 --- a/Test/baseResults/cppBad2.vert.out +++ b/Test/baseResults/cppBad2.vert.out @@ -1,6 +1,7 @@ cppBad2.vert ERROR: 0:3: 'macro expansion' : End of input in macro b -ERROR: 1 compilation errors. No code generated. +ERROR: 0:3: '' : compilation terminated +ERROR: 2 compilation errors. No code generated. Shader version: 100 diff --git a/Test/baseResults/cppBad3.vert.out b/Test/baseResults/cppBad3.vert.out index 46f94da0..c454c1a0 100755 --- a/Test/baseResults/cppBad3.vert.out +++ b/Test/baseResults/cppBad3.vert.out @@ -1,6 +1,7 @@ cppBad3.vert ERROR: 0:3: 'macro expansion' : End of input in macro y -ERROR: 1 compilation errors. No code generated. +ERROR: 0:3: '' : compilation terminated +ERROR: 2 compilation errors. No code generated. Shader version: 100 diff --git a/Test/baseResults/cppBad4.vert.out b/Test/baseResults/cppBad4.vert.out new file mode 100755 index 00000000..693ea8e8 --- /dev/null +++ b/Test/baseResults/cppBad4.vert.out @@ -0,0 +1,19 @@ +cppBad4.vert +ERROR: 0:4: 'macro expansion' : unexpected '#' g +ERROR: 0:5: '' : syntax error, unexpected SEMICOLON, expecting LEFT_PAREN +ERROR: 2 compilation errors. No code generated. + + +Shader version: 100 +ERROR: node is still EOpNull! +0:? Linker Objects + + +Linked vertex stage: + +ERROR: Linking vertex stage: Missing entry point: Each stage requires one entry point + +Shader version: 100 +ERROR: node is still EOpNull! +0:? Linker Objects + diff --git a/Test/baseResults/cppBad5.vert.out b/Test/baseResults/cppBad5.vert.out new file mode 100755 index 00000000..83043bb7 --- /dev/null +++ b/Test/baseResults/cppBad5.vert.out @@ -0,0 +1,19 @@ +cppBad5.vert +ERROR: 0:4: 'macro expansion' : End of input in macro g +ERROR: 0:5: '' : compilation terminated +ERROR: 2 compilation errors. No code generated. + + +Shader version: 100 +ERROR: node is still EOpNull! +0:? Linker Objects + + +Linked vertex stage: + +ERROR: Linking vertex stage: Missing entry point: Each stage requires one entry point + +Shader version: 100 +ERROR: node is still EOpNull! +0:? Linker Objects + diff --git a/Test/cppBad4.vert b/Test/cppBad4.vert new file mode 100755 index 00000000..ca438411 --- /dev/null +++ b/Test/cppBad4.vert @@ -0,0 +1,4 @@ +int,i= +#define f g(#g(y +#define g(m) +g(f) diff --git a/Test/cppBad5.vert b/Test/cppBad5.vert new file mode 100755 index 00000000..9ae5056b --- /dev/null +++ b/Test/cppBad5.vert @@ -0,0 +1,4 @@ +int,i= +#define f g($g(y +#define g(m) +g(f) diff --git a/glslang/MachineIndependent/preprocessor/Pp.cpp b/glslang/MachineIndependent/preprocessor/Pp.cpp index 0c5d5fe8..1b83bda2 100755 --- a/glslang/MachineIndependent/preprocessor/Pp.cpp +++ b/glslang/MachineIndependent/preprocessor/Pp.cpp @@ -1027,7 +1027,9 @@ TPpContext::TokenStream* TPpContext::PrescanMacroArg(TokenStream& arg, TPpToken* case MacroExpandNotStarted: break; case MacroExpandError: - token = EndOfInput; + // toss the rest of the pushed-input argument by scanning until tMarkerInput + while ((token = scanToken(ppToken)) != tMarkerInput::marker && token != EndOfInput) + ; break; case MacroExpandStarted: case MacroExpandUndef: @@ -1039,13 +1041,10 @@ TPpContext::TokenStream* TPpContext::PrescanMacroArg(TokenStream& arg, TPpToken* expandedArg->putToken(token, ppToken); } - if (token == EndOfInput) { + if (token != tMarkerInput::marker) { // Error, or MacroExpand ate the marker, so had bad input, recover delete expandedArg; expandedArg = nullptr; - } else { - // remove the marker - popInput(); } return expandedArg; @@ -1262,7 +1261,7 @@ MacroExpandResult TPpContext::MacroExpand(TPpToken* ppToken, bool expandUndef, b if (token == ')') { // closing paren of call - if (in->mac->args.size() == 1 && tokenRecorded == 0) + if (in->mac->args.size() == 1 && !tokenRecorded) break; arg++; break; diff --git a/glslang/MachineIndependent/preprocessor/PpScanner.cpp b/glslang/MachineIndependent/preprocessor/PpScanner.cpp index 40627f89..8dd1036c 100755 --- a/glslang/MachineIndependent/preprocessor/PpScanner.cpp +++ b/glslang/MachineIndependent/preprocessor/PpScanner.cpp @@ -1056,7 +1056,7 @@ int TPpContext::tokenize(TPpToken& ppToken) // Handle token-pasting logic token = tokenPaste(token, ppToken); - if (token == EndOfInput || token == tMarkerInput::marker) { + if (token == EndOfInput) { missingEndifCheck(); return EndOfInput; } diff --git a/gtests/AST.FromFile.cpp b/gtests/AST.FromFile.cpp index 2f1f0118..955e3a8d 100644 --- a/gtests/AST.FromFile.cpp +++ b/gtests/AST.FromFile.cpp @@ -97,6 +97,8 @@ INSTANTIATE_TEST_CASE_P( "cppBad.vert", "cppBad2.vert", "cppBad3.vert", + "cppBad4.vert", + "cppBad5.vert", "cppComplexExpr.vert", "cppDeepNest.frag", "cppPassMacroName.frag",