PP: Fix issue #426, recover from bad-source macro expansion.
This commit is contained in:
parent
bc5196c003
commit
faa720f14c
19
Test/baseResults/cppBad2.vert.out
Executable file
19
Test/baseResults/cppBad2.vert.out
Executable 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
3
Test/cppBad2.vert
Executable file
@ -0,0 +1,3 @@
|
|||||||
|
#define a b(
|
||||||
|
#define b(x)
|
||||||
|
b(a)
|
||||||
@ -2,5 +2,5 @@
|
|||||||
// For the version, it uses the latest git tag followed by the number of commits.
|
// 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).
|
// 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"
|
#define GLSLANG_DATE "02-Jan-2017"
|
||||||
|
|||||||
@ -934,12 +934,20 @@ TPpContext::TokenStream* TPpContext::PrescanMacroArg(TokenStream& arg, TPpToken*
|
|||||||
TokenStream* expandedArg = new TokenStream;
|
TokenStream* expandedArg = new TokenStream;
|
||||||
pushInput(new tMarkerInput(this));
|
pushInput(new tMarkerInput(this));
|
||||||
pushTokenStreamInput(arg);
|
pushTokenStreamInput(arg);
|
||||||
while ((token = scanToken(ppToken)) != tMarkerInput::marker) {
|
while ((token = scanToken(ppToken)) != tMarkerInput::marker && token != EndOfInput) {
|
||||||
if (token == PpAtomIdentifier && MacroExpand(ppToken, false, newLineOkay) != 0)
|
if (token == PpAtomIdentifier && MacroExpand(ppToken, false, newLineOkay) != 0)
|
||||||
continue;
|
continue;
|
||||||
RecordToken(*expandedArg, token, ppToken);
|
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;
|
return expandedArg;
|
||||||
}
|
}
|
||||||
@ -1133,7 +1141,7 @@ int TPpContext::MacroExpand(TPpToken* ppToken, bool expandUndef, bool newLineOka
|
|||||||
depth = 0;
|
depth = 0;
|
||||||
while (1) {
|
while (1) {
|
||||||
token = scanToken(ppToken);
|
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));
|
parseContext.ppError(loc, "End of input in macro", "macro expansion", atomStrings.getString(macroAtom));
|
||||||
delete in;
|
delete in;
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
@ -79,6 +79,7 @@ INSTANTIATE_TEST_CASE_P(
|
|||||||
"cppIndent.vert",
|
"cppIndent.vert",
|
||||||
"cppNest.vert",
|
"cppNest.vert",
|
||||||
"cppBad.vert",
|
"cppBad.vert",
|
||||||
|
"cppBad2.vert",
|
||||||
"cppComplexExpr.vert",
|
"cppComplexExpr.vert",
|
||||||
"badChars.frag",
|
"badChars.frag",
|
||||||
"pointCoord.frag",
|
"pointCoord.frag",
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user