diff --git a/Test/baseResults/cppBad2.vert.out b/Test/baseResults/cppBad2.vert.out new file mode 100755 index 0000000000000000000000000000000000000000..0398e5e484c40b13767cd601542a7aaa8485b383 --- /dev/null +++ b/Test/baseResults/cppBad2.vert.out @@ -0,0 +1,19 @@ +cppBad2.vert +ERROR: 0:3: 'macro expansion' : End of input in macro b +ERROR: 0:3: '' : 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/cppBad2.vert b/Test/cppBad2.vert new file mode 100755 index 0000000000000000000000000000000000000000..5e61b49ef353a0460364398255417e222352f534 --- /dev/null +++ b/Test/cppBad2.vert @@ -0,0 +1,3 @@ +#define a b( +#define b(x) +b(a) \ No newline at end of file diff --git a/glslang/Include/revision.h b/glslang/Include/revision.h index 4d9682526baf742f0ad5738f1db81f7f0bf34cb4..cccc79677f72190355198d5ce251e31553ec968c 100644 --- a/glslang/Include/revision.h +++ b/glslang/Include/revision.h @@ -2,5 +2,5 @@ // For the version, it uses the latest git tag followed by the number of commits. // For the date, it uses the current date (when then script is run). -#define GLSLANG_REVISION "Overload400-PrecQual.1727" +#define GLSLANG_REVISION "Overload400-PrecQual.1728" #define GLSLANG_DATE "02-Jan-2017" diff --git a/glslang/MachineIndependent/preprocessor/Pp.cpp b/glslang/MachineIndependent/preprocessor/Pp.cpp index 595b7295d5a753cb90175ba02c7622442184bafd..eb2f3dfaf99697e91c67d3118798f598f5613639 100644 --- a/glslang/MachineIndependent/preprocessor/Pp.cpp +++ b/glslang/MachineIndependent/preprocessor/Pp.cpp @@ -934,12 +934,20 @@ TPpContext::TokenStream* TPpContext::PrescanMacroArg(TokenStream& arg, TPpToken* TokenStream* expandedArg = new TokenStream; pushInput(new tMarkerInput(this)); pushTokenStreamInput(arg); - while ((token = scanToken(ppToken)) != tMarkerInput::marker) { + while ((token = scanToken(ppToken)) != tMarkerInput::marker && token != EndOfInput) { if (token == PpAtomIdentifier && MacroExpand(ppToken, false, newLineOkay) != 0) continue; RecordToken(*expandedArg, token, ppToken); } - popInput(); + + if (token == EndOfInput) { + // MacroExpand ate the marker, so had bad input, recover + delete expandedArg; + expandedArg = nullptr; + } else { + // remove the marker + popInput(); + } return expandedArg; } @@ -1133,7 +1141,7 @@ int TPpContext::MacroExpand(TPpToken* ppToken, bool expandUndef, bool newLineOka depth = 0; while (1) { token = scanToken(ppToken); - if (token == EndOfInput) { + if (token == EndOfInput || token == tMarkerInput::marker) { parseContext.ppError(loc, "End of input in macro", "macro expansion", atomStrings.getString(macroAtom)); delete in; return 0; diff --git a/gtests/AST.FromFile.cpp b/gtests/AST.FromFile.cpp index 70705337f52a8bb14862536fa85ebfed262d69e1..d8a5ef94c92fa29b9bd3366a44d4643b5e3a710c 100644 --- a/gtests/AST.FromFile.cpp +++ b/gtests/AST.FromFile.cpp @@ -79,6 +79,7 @@ INSTANTIATE_TEST_CASE_P( "cppIndent.vert", "cppNest.vert", "cppBad.vert", + "cppBad2.vert", "cppComplexExpr.vert", "badChars.frag", "pointCoord.frag",