Allow future keywords to be accessed as members in a struct.
authorJohn Kessenich <cepheus@frii.com>
Fri, 2 Oct 2015 21:01:53 +0000 (15:01 -0600)
committerJohn Kessenich <cepheus@frii.com>
Fri, 2 Oct 2015 21:01:53 +0000 (15:01 -0600)
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.

Test/330.frag
Test/400.frag
Test/baseResults/330.frag.out
Test/baseResults/400.frag.out
glslang/Include/revision.h
glslang/MachineIndependent/Scan.cpp
glslang/MachineIndependent/glslang.y

index a3301a2..57736b0 100644 (file)
@@ -140,3 +140,11 @@ void qlod()
     lod = textureQueryLod(samp1D, pf);      // ERROR, not until 400\r
     lod = textureQueryLod(samp2Ds, pf2);    // ERROR, not until 400\r
 }\r
+\r
+int precise;                // okay, not a keyword yet\r
+struct SKeyMem { int precise; } KeyMem; // okay, not a keyword yet\r
+\r
+void fooKeyMem()\r
+{\r
+    KeyMem.precise;\r
+}\r
index a2c4691..bb4d2b5 100644 (file)
@@ -183,3 +183,5 @@ void qlod()
     lod = textureQueryLod(sampBuf, pf);     // ERROR\r
     lod = textureQueryLod(sampRect, pf2);   // ERROR\r
 }\r
+\r
+struct SKeyMem { int precise; } KeyMem;     // ERROR, keyword can't be a member\r
index 2def6c7..773a72c 100644 (file)
@@ -79,6 +79,13 @@ ERROR: node is still EOpNull!
 0:?     Sequence\r
 0:140      'lod' (temp 2-component vector of float)\r
 0:141      'lod' (temp 2-component vector of float)\r
+0:147  Function Definition: fooKeyMem( (global void)\r
+0:147    Function Parameters: \r
+0:149    Sequence\r
+0:149      precise: direct index for structure (global int)\r
+0:149        'KeyMem' (global structure{global int precise})\r
+0:149        Constant:\r
+0:149          0 (const int)\r
 0:?   Linker Objects\r
 0:?     'inVar' (smooth in 4-component vector of float)\r
 0:?     'outVar' (layout(location=0 index=0 ) out 4-component vector of float)\r
@@ -113,6 +120,8 @@ ERROR: node is still EOpNull!
 0:?     'indexBlockI' (layout(location=26 index=0 ) out block{out int a})\r
 0:?     'samp1D' (uniform sampler1D)\r
 0:?     'samp2Ds' (uniform sampler2DShadow)\r
+0:?     'precise' (global int)\r
+0:?     'KeyMem' (global structure{global int precise})\r
 \r
 \r
 Linked fragment stage:\r
@@ -159,6 +168,13 @@ ERROR: node is still EOpNull!
 0:?     Sequence\r
 0:140      'lod' (temp 2-component vector of float)\r
 0:141      'lod' (temp 2-component vector of float)\r
+0:147  Function Definition: fooKeyMem( (global void)\r
+0:147    Function Parameters: \r
+0:149    Sequence\r
+0:149      precise: direct index for structure (global int)\r
+0:149        'KeyMem' (global structure{global int precise})\r
+0:149        Constant:\r
+0:149          0 (const int)\r
 0:?   Linker Objects\r
 0:?     'inVar' (smooth in 4-component vector of float)\r
 0:?     'outVar' (layout(location=0 index=0 ) out 4-component vector of float)\r
@@ -193,4 +209,6 @@ ERROR: node is still EOpNull!
 0:?     'indexBlockI' (layout(location=26 index=0 ) out block{out int a})\r
 0:?     'samp1D' (uniform sampler1D)\r
 0:?     'samp2Ds' (uniform sampler2DShadow)\r
+0:?     'precise' (global int)\r
+0:?     'KeyMem' (global structure{global int precise})\r
 \r
index 7e09e8a..b620b14 100644 (file)
@@ -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'\r
 ERROR: 0:184: 'textureQueryLod' : no matching overloaded function found \r
 ERROR: 0:184: 'assign' :  cannot convert from 'const float' to 'temp 2-component vector of float'\r
-ERROR: 34 compilation errors.  No code generated.\r
+ERROR: 0:187: '' :  syntax error\r
+ERROR: 35 compilation errors.  No code generated.\r
 \r
 \r
 Shader version: 400\r
index 414cf21..e74c41a 100644 (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 "3.0.777"
-#define GLSLANG_DATE "01-Oct-2015"
+#define GLSLANG_REVISION "3.0.778"
+#define GLSLANG_DATE "02-Oct-2015"
index 325a9a9..23e5191 100644 (file)
@@ -598,7 +598,12 @@ int TScanContext::tokenize(TPpContext* pp, TParserToken& token)
         case PpAtomConstUint:          parserToken->sType.lex.i = ppToken.ival;       return UINTCONSTANT;
         case PpAtomConstFloat:         parserToken->sType.lex.d = ppToken.dval;       return FLOATCONSTANT;
         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;
 
@@ -623,7 +628,6 @@ int TScanContext::tokenizeIdentifier()
         return identifierOrType();
     }
     keyword = it->second;
-    field = false;
 
     switch (keyword) {
     case CONST:
@@ -1020,11 +1024,8 @@ int TScanContext::tokenizeIdentifier()
 int TScanContext::identifierOrType()
 {
     parserToken->sType.lex.string = NewPoolTString(tokenText);
-    if (field) {
-        field = false;
-        return FIELD_SELECTION;
-    }
+    if (field)
+        return IDENTIFIER;
 
     parserToken->sType.lex.symbol = parseContext.symbolTable.find(*parserToken->sType.lex.string);
     if (afterType == false && parserToken->sType.lex.symbol) {
index e7eb320..0e0fca2 100644 (file)
@@ -162,7 +162,6 @@ extern int yylex(YYSTYPE*, TParseContext&);
 
 %token <lex> IDENTIFIER TYPE_NAME
 %token <lex> FLOATCONSTANT DOUBLECONSTANT INTCONSTANT UINTCONSTANT BOOLCONSTANT
-%token <lex> FIELD_SELECTION
 %token <lex> LEFT_OP RIGHT_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
@@ -266,7 +265,7 @@ postfix_expression
     | function_call {
         $$ = $1;
     }
-    | postfix_expression DOT FIELD_SELECTION {
+    | postfix_expression DOT IDENTIFIER {
         $$ = parseContext.handleDotDereference($3.loc, $1, *$3.string);
     }
     | postfix_expression INC_OP {