PP: Support operator creation with token pasting.
This commit is contained in:
parent
0c4b7c931a
commit
224b1f733b
@ -3,8 +3,9 @@ Warning, version 450 is not yet complete; most version-specific features are pre
|
|||||||
ERROR: 0:38: '##' : unexpected location
|
ERROR: 0:38: '##' : unexpected location
|
||||||
ERROR: 0:40: '##' : unexpected location; end of replacement list
|
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: '##' : only supported for preprocessing identifiers
|
ERROR: 0:52: '##' : not supported for these tokens
|
||||||
ERROR: 4 compilation errors. No code generated.
|
ERROR: 0:69: '##' : combined token is invalid
|
||||||
|
ERROR: 5 compilation errors. No code generated.
|
||||||
|
|
||||||
|
|
||||||
Shader version: 450
|
Shader version: 450
|
||||||
@ -14,6 +15,35 @@ ERROR: node is still EOpNull!
|
|||||||
0:52 'a' (global int)
|
0:52 'a' (global int)
|
||||||
0:52 Constant:
|
0:52 Constant:
|
||||||
0:52 11 (const int)
|
0:52 11 (const int)
|
||||||
|
0:58 Sequence
|
||||||
|
0:58 move second child to first child (temp int)
|
||||||
|
0:58 'cop' (global int)
|
||||||
|
0:58 Constant:
|
||||||
|
0:58 160 (const int)
|
||||||
|
0:59 Sequence
|
||||||
|
0:59 move second child to first child (temp bool)
|
||||||
|
0:59 'dop' (global bool)
|
||||||
|
0:59 Constant:
|
||||||
|
0:59 true (const bool)
|
||||||
|
0:63 Function Definition: ShouldntExpandToThis( (global void)
|
||||||
|
0:63 Function Parameters:
|
||||||
|
0:65 Sequence
|
||||||
|
0:65 Sequence
|
||||||
|
0:65 move second child to first child (temp int)
|
||||||
|
0:65 'e' (temp int)
|
||||||
|
0:65 Constant:
|
||||||
|
0:65 16 (const int)
|
||||||
|
0:66 right shift second child into first child (temp int)
|
||||||
|
0:66 'e' (temp int)
|
||||||
|
0:66 Constant:
|
||||||
|
0:66 2 (const int)
|
||||||
|
0:69 Sequence
|
||||||
|
0:69 move second child to first child (temp bool)
|
||||||
|
0:69 'f' (temp bool)
|
||||||
|
0:69 Compare Greater Than (temp bool)
|
||||||
|
0:69 'e' (temp int)
|
||||||
|
0:69 Constant:
|
||||||
|
0:69 5 (const int)
|
||||||
0:? Linker Objects
|
0:? Linker Objects
|
||||||
0:? 'SecondExpansion' (global int)
|
0:? 'SecondExpansion' (global int)
|
||||||
0:? 'PostPasteExpansion' (global int)
|
0:? 'PostPasteExpansion' (global int)
|
||||||
@ -25,8 +55,14 @@ ERROR: node is still EOpNull!
|
|||||||
0:? 'dc1' (global float)
|
0:? 'dc1' (global float)
|
||||||
0:? 'dc2' (global float)
|
0:? 'dc2' (global float)
|
||||||
0:? 'foo875' (uniform float)
|
0:? 'foo875' (uniform float)
|
||||||
0:? 'ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123451234' (global float)
|
0:? 'ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF012345' (global float)
|
||||||
0:? 'a' (global int)
|
0:? 'a' (global int)
|
||||||
|
0:? 'aop' (const int)
|
||||||
|
0:? 10 (const int)
|
||||||
|
0:? 'bop' (const int)
|
||||||
|
0:? 4 (const int)
|
||||||
|
0:? 'cop' (global int)
|
||||||
|
0:? 'dop' (global bool)
|
||||||
0:? 'gl_VertexID' (gl_VertexId int VertexId)
|
0:? 'gl_VertexID' (gl_VertexId int VertexId)
|
||||||
0:? 'gl_InstanceID' (gl_InstanceId int InstanceId)
|
0:? 'gl_InstanceID' (gl_InstanceId int InstanceId)
|
||||||
|
|
||||||
@ -42,6 +78,16 @@ ERROR: node is still EOpNull!
|
|||||||
0:52 'a' (global int)
|
0:52 'a' (global int)
|
||||||
0:52 Constant:
|
0:52 Constant:
|
||||||
0:52 11 (const int)
|
0:52 11 (const int)
|
||||||
|
0:58 Sequence
|
||||||
|
0:58 move second child to first child (temp int)
|
||||||
|
0:58 'cop' (global int)
|
||||||
|
0:58 Constant:
|
||||||
|
0:58 160 (const int)
|
||||||
|
0:59 Sequence
|
||||||
|
0:59 move second child to first child (temp bool)
|
||||||
|
0:59 'dop' (global bool)
|
||||||
|
0:59 Constant:
|
||||||
|
0:59 true (const bool)
|
||||||
0:? Linker Objects
|
0:? Linker Objects
|
||||||
0:? 'SecondExpansion' (global int)
|
0:? 'SecondExpansion' (global int)
|
||||||
0:? 'PostPasteExpansion' (global int)
|
0:? 'PostPasteExpansion' (global int)
|
||||||
@ -53,8 +99,14 @@ ERROR: node is still EOpNull!
|
|||||||
0:? 'dc1' (global float)
|
0:? 'dc1' (global float)
|
||||||
0:? 'dc2' (global float)
|
0:? 'dc2' (global float)
|
||||||
0:? 'foo875' (uniform float)
|
0:? 'foo875' (uniform float)
|
||||||
0:? 'ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123451234' (global float)
|
0:? 'ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF012345' (global float)
|
||||||
0:? 'a' (global int)
|
0:? 'a' (global int)
|
||||||
|
0:? 'aop' (const int)
|
||||||
|
0:? 10 (const int)
|
||||||
|
0:? 'bop' (const int)
|
||||||
|
0:? 4 (const int)
|
||||||
|
0:? 'cop' (global int)
|
||||||
|
0:? 'dop' (global bool)
|
||||||
0:? 'gl_VertexID' (gl_VertexId int VertexId)
|
0:? 'gl_VertexID' (gl_VertexId int VertexId)
|
||||||
0:? 'gl_InstanceID' (gl_InstanceId int InstanceId)
|
0:? 'gl_InstanceID' (gl_InstanceId int InstanceId)
|
||||||
|
|
||||||
|
|||||||
@ -50,3 +50,21 @@ float simplePaste(ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF01234567
|
|||||||
|
|
||||||
// non-identifiers
|
// non-identifiers
|
||||||
int a = simplePaste(11,12);
|
int a = simplePaste(11,12);
|
||||||
|
|
||||||
|
// operators
|
||||||
|
#define MAKE_OP(L, R) L ## R
|
||||||
|
const int aop = 10;
|
||||||
|
const int bop = 4;
|
||||||
|
int cop = aop MAKE_OP(<, <) bop;
|
||||||
|
bool dop = aop MAKE_OP(!,=) bop;
|
||||||
|
|
||||||
|
#define MAKE_OP3(L, M, R) L ## M ## R
|
||||||
|
|
||||||
|
void foo()
|
||||||
|
{
|
||||||
|
int e = 16;
|
||||||
|
e MAKE_OP3(>,>,=) 2;
|
||||||
|
|
||||||
|
// recovery from bad op
|
||||||
|
bool f = e MAKE_OP(>,!) 5;
|
||||||
|
}
|
||||||
|
|||||||
@ -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.1719"
|
#define GLSLANG_REVISION "Overload400-PrecQual.1720"
|
||||||
#define GLSLANG_DATE "21-Dec-2016"
|
#define GLSLANG_DATE "21-Dec-2016"
|
||||||
|
|||||||
@ -813,12 +813,52 @@ int TPpContext::tokenPaste(int token, TPpToken& ppToken)
|
|||||||
// get the token after the ##
|
// get the token after the ##
|
||||||
token = scanToken(&pastedPpToken);
|
token = scanToken(&pastedPpToken);
|
||||||
|
|
||||||
|
// get the token text
|
||||||
|
switch (resultToken) {
|
||||||
|
case PpAtomIdentifier:
|
||||||
|
// already have the correct text in token.names
|
||||||
|
break;
|
||||||
|
case '=':
|
||||||
|
case '!':
|
||||||
|
case '-':
|
||||||
|
case '~':
|
||||||
|
case '+':
|
||||||
|
case '*':
|
||||||
|
case '/':
|
||||||
|
case '%':
|
||||||
|
case '<':
|
||||||
|
case '>':
|
||||||
|
case '|':
|
||||||
|
case '^':
|
||||||
|
case '&':
|
||||||
|
case PpAtomRight:
|
||||||
|
case PpAtomLeft:
|
||||||
|
case PpAtomAnd:
|
||||||
|
case PpAtomOr:
|
||||||
|
case PpAtomXor:
|
||||||
|
strcpy(ppToken.name, GetAtomString(resultToken));
|
||||||
|
strcpy(pastedPpToken.name, GetAtomString(token));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
parseContext.ppError(ppToken.loc, "not supported for these tokens", "##", "");
|
||||||
|
return resultToken;
|
||||||
|
}
|
||||||
|
|
||||||
// combine the tokens
|
// combine the tokens
|
||||||
if (resultToken != PpAtomIdentifier)
|
if (strlen(ppToken.name) + strlen(pastedPpToken.name) > MaxTokenLength) {
|
||||||
parseContext.ppError(ppToken.loc, "only supported for preprocessing identifiers", "##", "");
|
|
||||||
if (strlen(ppToken.name) + strlen(pastedPpToken.name) > MaxTokenLength)
|
|
||||||
parseContext.ppError(ppToken.loc, "combined tokens are too long", "##", "");
|
parseContext.ppError(ppToken.loc, "combined tokens are too long", "##", "");
|
||||||
|
return resultToken;
|
||||||
|
}
|
||||||
strncat(ppToken.name, pastedPpToken.name, MaxTokenLength - strlen(ppToken.name));
|
strncat(ppToken.name, pastedPpToken.name, MaxTokenLength - strlen(ppToken.name));
|
||||||
|
|
||||||
|
// correct the kind of token we are making, if needed (identifiers stay identifiers)
|
||||||
|
if (resultToken != PpAtomIdentifier) {
|
||||||
|
int newToken = LookUpString(ppToken.name);
|
||||||
|
if (newToken > 0)
|
||||||
|
resultToken = newToken;
|
||||||
|
else
|
||||||
|
parseContext.ppError(ppToken.loc, "combined token is invalid", "##", "");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return resultToken;
|
return resultToken;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user