Allow future keywords to be accessed as members in a struct.
This fixes a bug where a token that could be a keyword in one version is not a keyword in another version, but treated like a non-member after a "." dereference.
This commit is contained in:
parent
6373574b13
commit
eb505e4262
@ -140,3 +140,11 @@ void qlod()
|
|||||||
lod = textureQueryLod(samp1D, pf); // ERROR, not until 400
|
lod = textureQueryLod(samp1D, pf); // ERROR, not until 400
|
||||||
lod = textureQueryLod(samp2Ds, pf2); // ERROR, not until 400
|
lod = textureQueryLod(samp2Ds, pf2); // ERROR, not until 400
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int precise; // okay, not a keyword yet
|
||||||
|
struct SKeyMem { int precise; } KeyMem; // okay, not a keyword yet
|
||||||
|
|
||||||
|
void fooKeyMem()
|
||||||
|
{
|
||||||
|
KeyMem.precise;
|
||||||
|
}
|
||||||
|
@ -183,3 +183,5 @@ void qlod()
|
|||||||
lod = textureQueryLod(sampBuf, pf); // ERROR
|
lod = textureQueryLod(sampBuf, pf); // ERROR
|
||||||
lod = textureQueryLod(sampRect, pf2); // ERROR
|
lod = textureQueryLod(sampRect, pf2); // ERROR
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct SKeyMem { int precise; } KeyMem; // ERROR, keyword can't be a member
|
||||||
|
@ -79,6 +79,13 @@ ERROR: node is still EOpNull!
|
|||||||
0:? Sequence
|
0:? Sequence
|
||||||
0:140 'lod' (temp 2-component vector of float)
|
0:140 'lod' (temp 2-component vector of float)
|
||||||
0:141 'lod' (temp 2-component vector of float)
|
0:141 'lod' (temp 2-component vector of float)
|
||||||
|
0:147 Function Definition: fooKeyMem( (global void)
|
||||||
|
0:147 Function Parameters:
|
||||||
|
0:149 Sequence
|
||||||
|
0:149 precise: direct index for structure (global int)
|
||||||
|
0:149 'KeyMem' (global structure{global int precise})
|
||||||
|
0:149 Constant:
|
||||||
|
0:149 0 (const int)
|
||||||
0:? Linker Objects
|
0:? Linker Objects
|
||||||
0:? 'inVar' (smooth in 4-component vector of float)
|
0:? 'inVar' (smooth in 4-component vector of float)
|
||||||
0:? 'outVar' (layout(location=0 index=0 ) out 4-component vector of float)
|
0:? 'outVar' (layout(location=0 index=0 ) out 4-component vector of float)
|
||||||
@ -113,6 +120,8 @@ ERROR: node is still EOpNull!
|
|||||||
0:? 'indexBlockI' (layout(location=26 index=0 ) out block{out int a})
|
0:? 'indexBlockI' (layout(location=26 index=0 ) out block{out int a})
|
||||||
0:? 'samp1D' (uniform sampler1D)
|
0:? 'samp1D' (uniform sampler1D)
|
||||||
0:? 'samp2Ds' (uniform sampler2DShadow)
|
0:? 'samp2Ds' (uniform sampler2DShadow)
|
||||||
|
0:? 'precise' (global int)
|
||||||
|
0:? 'KeyMem' (global structure{global int precise})
|
||||||
|
|
||||||
|
|
||||||
Linked fragment stage:
|
Linked fragment stage:
|
||||||
@ -159,6 +168,13 @@ ERROR: node is still EOpNull!
|
|||||||
0:? Sequence
|
0:? Sequence
|
||||||
0:140 'lod' (temp 2-component vector of float)
|
0:140 'lod' (temp 2-component vector of float)
|
||||||
0:141 'lod' (temp 2-component vector of float)
|
0:141 'lod' (temp 2-component vector of float)
|
||||||
|
0:147 Function Definition: fooKeyMem( (global void)
|
||||||
|
0:147 Function Parameters:
|
||||||
|
0:149 Sequence
|
||||||
|
0:149 precise: direct index for structure (global int)
|
||||||
|
0:149 'KeyMem' (global structure{global int precise})
|
||||||
|
0:149 Constant:
|
||||||
|
0:149 0 (const int)
|
||||||
0:? Linker Objects
|
0:? Linker Objects
|
||||||
0:? 'inVar' (smooth in 4-component vector of float)
|
0:? 'inVar' (smooth in 4-component vector of float)
|
||||||
0:? 'outVar' (layout(location=0 index=0 ) out 4-component vector of float)
|
0:? 'outVar' (layout(location=0 index=0 ) out 4-component vector of float)
|
||||||
@ -193,4 +209,6 @@ ERROR: node is still EOpNull!
|
|||||||
0:? 'indexBlockI' (layout(location=26 index=0 ) out block{out int a})
|
0:? 'indexBlockI' (layout(location=26 index=0 ) out block{out int a})
|
||||||
0:? 'samp1D' (uniform sampler1D)
|
0:? 'samp1D' (uniform sampler1D)
|
||||||
0:? 'samp2Ds' (uniform sampler2DShadow)
|
0:? 'samp2Ds' (uniform sampler2DShadow)
|
||||||
|
0:? 'precise' (global int)
|
||||||
|
0:? 'KeyMem' (global structure{global int precise})
|
||||||
|
|
||||||
|
@ -34,7 +34,8 @@ ERROR: 0:183: 'textureQueryLod' : no matching overloaded function found
|
|||||||
ERROR: 0:183: 'assign' : cannot convert from 'const float' to 'temp 2-component vector of float'
|
ERROR: 0:183: 'assign' : cannot convert from 'const float' to 'temp 2-component vector of float'
|
||||||
ERROR: 0:184: 'textureQueryLod' : no matching overloaded function found
|
ERROR: 0:184: 'textureQueryLod' : no matching overloaded function found
|
||||||
ERROR: 0:184: 'assign' : cannot convert from 'const float' to 'temp 2-component vector of float'
|
ERROR: 0:184: 'assign' : cannot convert from 'const float' to 'temp 2-component vector of float'
|
||||||
ERROR: 34 compilation errors. No code generated.
|
ERROR: 0:187: '' : syntax error
|
||||||
|
ERROR: 35 compilation errors. No code generated.
|
||||||
|
|
||||||
|
|
||||||
Shader version: 400
|
Shader version: 400
|
||||||
|
@ -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 "3.0.777"
|
#define GLSLANG_REVISION "3.0.778"
|
||||||
#define GLSLANG_DATE "01-Oct-2015"
|
#define GLSLANG_DATE "02-Oct-2015"
|
||||||
|
@ -598,7 +598,12 @@ int TScanContext::tokenize(TPpContext* pp, TParserToken& token)
|
|||||||
case PpAtomConstUint: parserToken->sType.lex.i = ppToken.ival; return UINTCONSTANT;
|
case PpAtomConstUint: parserToken->sType.lex.i = ppToken.ival; return UINTCONSTANT;
|
||||||
case PpAtomConstFloat: parserToken->sType.lex.d = ppToken.dval; return FLOATCONSTANT;
|
case PpAtomConstFloat: parserToken->sType.lex.d = ppToken.dval; return FLOATCONSTANT;
|
||||||
case PpAtomConstDouble: parserToken->sType.lex.d = ppToken.dval; return DOUBLECONSTANT;
|
case PpAtomConstDouble: parserToken->sType.lex.d = ppToken.dval; return DOUBLECONSTANT;
|
||||||
case PpAtomIdentifier: return tokenizeIdentifier();
|
case PpAtomIdentifier:
|
||||||
|
{
|
||||||
|
int token = tokenizeIdentifier();
|
||||||
|
field = false;
|
||||||
|
return token;
|
||||||
|
}
|
||||||
|
|
||||||
case EndOfInput: return 0;
|
case EndOfInput: return 0;
|
||||||
|
|
||||||
@ -623,7 +628,6 @@ int TScanContext::tokenizeIdentifier()
|
|||||||
return identifierOrType();
|
return identifierOrType();
|
||||||
}
|
}
|
||||||
keyword = it->second;
|
keyword = it->second;
|
||||||
field = false;
|
|
||||||
|
|
||||||
switch (keyword) {
|
switch (keyword) {
|
||||||
case CONST:
|
case CONST:
|
||||||
@ -1020,11 +1024,8 @@ int TScanContext::tokenizeIdentifier()
|
|||||||
int TScanContext::identifierOrType()
|
int TScanContext::identifierOrType()
|
||||||
{
|
{
|
||||||
parserToken->sType.lex.string = NewPoolTString(tokenText);
|
parserToken->sType.lex.string = NewPoolTString(tokenText);
|
||||||
if (field) {
|
if (field)
|
||||||
field = false;
|
return IDENTIFIER;
|
||||||
|
|
||||||
return FIELD_SELECTION;
|
|
||||||
}
|
|
||||||
|
|
||||||
parserToken->sType.lex.symbol = parseContext.symbolTable.find(*parserToken->sType.lex.string);
|
parserToken->sType.lex.symbol = parseContext.symbolTable.find(*parserToken->sType.lex.string);
|
||||||
if (afterType == false && parserToken->sType.lex.symbol) {
|
if (afterType == false && parserToken->sType.lex.symbol) {
|
||||||
|
@ -162,7 +162,6 @@ extern int yylex(YYSTYPE*, TParseContext&);
|
|||||||
|
|
||||||
%token <lex> IDENTIFIER TYPE_NAME
|
%token <lex> IDENTIFIER TYPE_NAME
|
||||||
%token <lex> FLOATCONSTANT DOUBLECONSTANT INTCONSTANT UINTCONSTANT BOOLCONSTANT
|
%token <lex> FLOATCONSTANT DOUBLECONSTANT INTCONSTANT UINTCONSTANT BOOLCONSTANT
|
||||||
%token <lex> FIELD_SELECTION
|
|
||||||
%token <lex> LEFT_OP RIGHT_OP
|
%token <lex> LEFT_OP RIGHT_OP
|
||||||
%token <lex> INC_OP DEC_OP LE_OP GE_OP EQ_OP NE_OP
|
%token <lex> INC_OP DEC_OP LE_OP GE_OP EQ_OP NE_OP
|
||||||
%token <lex> AND_OP OR_OP XOR_OP MUL_ASSIGN DIV_ASSIGN ADD_ASSIGN
|
%token <lex> AND_OP OR_OP XOR_OP MUL_ASSIGN DIV_ASSIGN ADD_ASSIGN
|
||||||
@ -266,7 +265,7 @@ postfix_expression
|
|||||||
| function_call {
|
| function_call {
|
||||||
$$ = $1;
|
$$ = $1;
|
||||||
}
|
}
|
||||||
| postfix_expression DOT FIELD_SELECTION {
|
| postfix_expression DOT IDENTIFIER {
|
||||||
$$ = parseContext.handleDotDereference($3.loc, $1, *$3.string);
|
$$ = parseContext.handleDotDereference($3.loc, $1, *$3.string);
|
||||||
}
|
}
|
||||||
| postfix_expression INC_OP {
|
| postfix_expression INC_OP {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user