PP: Partially address issue #738: handle premature end of argument when token pasting.

This commit is contained in:
John Kessenich 2017-02-28 18:04:47 -07:00
parent 45c1b5b980
commit fb22b69fc6
4 changed files with 10 additions and 2 deletions

View File

@ -5,7 +5,10 @@ ERROR: 0:40: '##' : unexpected location; end of replacement list
ERROR: 0:49: '##' : combined tokens are too long ERROR: 0:49: '##' : combined tokens are too long
ERROR: 0:52: '##' : not supported for these tokens ERROR: 0:52: '##' : not supported for these tokens
ERROR: 0:69: '##' : combined token is invalid ERROR: 0:69: '##' : combined token is invalid
ERROR: 5 compilation errors. No code generated. ERROR: 0:82: 'macro expansion' : Too few args in Macro rec
ERROR: 0:82: '##' : unexpected location
ERROR: 0:82: '##' : unexpected location
ERROR: 8 compilation errors. No code generated.
Shader version: 450 Shader version: 450

View File

@ -77,3 +77,6 @@ uniform M_OUTER(argPaste);
#define M_NEST2(q) int q ## suff #define M_NEST2(q) int q ## suff
#define M_OUTER2(p) M_NEST2(p ## 20) #define M_OUTER2(p) M_NEST2(p ## 20)
uniform M_OUTER2(argPaste); uniform M_OUTER2(argPaste);
#define rec(x)##
rec(rec())

View File

@ -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.1858" #define GLSLANG_REVISION "Overload400-PrecQual.1861"
#define GLSLANG_DATE "28-Feb-2017" #define GLSLANG_DATE "28-Feb-2017"

View File

@ -986,6 +986,8 @@ TPpContext::TokenStream* TPpContext::PrescanMacroArg(TokenStream& arg, TPpToken*
int token; int token;
while ((token = scanToken(ppToken)) != tMarkerInput::marker && token != EndOfInput) { while ((token = scanToken(ppToken)) != tMarkerInput::marker && token != EndOfInput) {
token = tokenPaste(token, *ppToken); token = tokenPaste(token, *ppToken);
if (token == tMarkerInput::marker || token == EndOfInput)
break;
if (token == PpAtomIdentifier && MacroExpand(ppToken, false, newLineOkay) != 0) if (token == PpAtomIdentifier && MacroExpand(ppToken, false, newLineOkay) != 0)
continue; continue;
expandedArg->putToken(token, ppToken); expandedArg->putToken(token, ppToken);