PP: Fix issue #426, recover from bad-source macro expansion.

This commit is contained in:
John Kessenich 2017-01-02 17:56:08 -07:00
parent bc5196c003
commit faa720f14c
5 changed files with 35 additions and 4 deletions

View File

@ -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

3
Test/cppBad2.vert Executable file
View File

@ -0,0 +1,3 @@
#define a b(
#define b(x)
b(a)

View File

@ -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"

View File

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

View File

@ -79,6 +79,7 @@ INSTANTIATE_TEST_CASE_P(
"cppIndent.vert",
"cppNest.vert",
"cppBad.vert",
"cppBad2.vert",
"cppComplexExpr.vert",
"badChars.frag",
"pointCoord.frag",