diff --git a/Test/110scope.vert b/Test/110scope.vert old mode 100644 new mode 100755 index e28db0fdb32fd56e0ac021a12f346b8b6336f623..86c27a584e484f519d0c370fe42e524de89d0973 --- a/Test/110scope.vert +++ b/Test/110scope.vert @@ -71,4 +71,17 @@ void main() int degrees; degrees(3.2); + + { + S s; + s.x = 3; + struct S { // okay, hides S + bool b; + }; + S t; + t.b = true; + struct S { // ERROR, redefinition of struct S + float f; + }; + } } diff --git a/Test/baseResults/110scope.vert.out b/Test/baseResults/110scope.vert.out index a07de4fb3c8aacc6a95a71bef39cc385f8ab51ea..e23d3c0f462085d4f90e1f3cfbe98d79a1d1c476 100644 --- a/Test/baseResults/110scope.vert.out +++ b/Test/baseResults/110scope.vert.out @@ -2,7 +2,8 @@ ERROR: 0:5: 'a' : redefinition ERROR: 0:57: 'z' : undeclared identifier ERROR: 0:57: 'z' : redefinition -ERROR: 3 compilation errors. No code generated. +ERROR: 0:83: 'S' : redefinition struct +ERROR: 4 compilation errors. No code generated. Shader version: 110 @@ -120,6 +121,21 @@ ERROR: node is still EOpNull! 0:69 0 (const int) 0:73 Constant: 0:73 183.346494 +0:? Sequence +0:77 move second child to first child ( temp int) +0:77 x: direct index for structure ( temp int) +0:77 's' ( temp structure{ temp int x}) +0:77 Constant: +0:77 0 (const int) +0:77 Constant: +0:77 3 (const int) +0:82 move second child to first child ( temp bool) +0:82 b: direct index for structure ( temp bool) +0:82 't' ( temp structure{ temp bool b}) +0:82 Constant: +0:82 0 (const int) +0:82 Constant: +0:82 true (const bool) 0:? Linker Objects 0:? 'b' ( global bool) 0:? 'c' ( global bool) @@ -236,6 +252,21 @@ ERROR: node is still EOpNull! 0:69 0 (const int) 0:73 Constant: 0:73 183.346494 +0:? Sequence +0:77 move second child to first child ( temp int) +0:77 x: direct index for structure ( temp int) +0:77 's' ( temp structure{ temp int x}) +0:77 Constant: +0:77 0 (const int) +0:77 Constant: +0:77 3 (const int) +0:82 move second child to first child ( temp bool) +0:82 b: direct index for structure ( temp bool) +0:82 't' ( temp structure{ temp bool b}) +0:82 Constant: +0:82 0 (const int) +0:82 Constant: +0:82 true (const bool) 0:? Linker Objects 0:? 'b' ( global bool) 0:? 'c' ( global bool) diff --git a/glslang/MachineIndependent/Scan.cpp b/glslang/MachineIndependent/Scan.cpp index 7232baeb2913fa3a7b0ec5069cdd15b848f96e03..aa21d8a11efebff80fdd59bf0dd2e5598773b1d9 100755 --- a/glslang/MachineIndependent/Scan.cpp +++ b/glslang/MachineIndependent/Scan.cpp @@ -778,7 +778,7 @@ int TScanContext::tokenize(TPpContext* pp, TParserToken& token) case '?': return QUESTION; case '[': return LEFT_BRACKET; case ']': return RIGHT_BRACKET; - case '{': return LEFT_BRACE; + case '{': afterStruct = false; return LEFT_BRACE; case '}': return RIGHT_BRACE; case '\\': parseContext.error(loc, "illegal use of escape character", "\\", ""); @@ -861,7 +861,6 @@ int TScanContext::tokenizeIdentifier() case IN: case OUT: case INOUT: - case STRUCT: case BREAK: case CONTINUE: case DO: @@ -874,6 +873,10 @@ int TScanContext::tokenizeIdentifier() case CASE: return keyword; + case STRUCT: + afterStruct = true; + return keyword; + case NONUNIFORM: if (parseContext.extensionTurnedOn(E_GL_EXT_nonuniform_qualifier)) return keyword; @@ -1537,7 +1540,7 @@ int TScanContext::identifierOrType() return IDENTIFIER; parserToken->sType.lex.symbol = parseContext.symbolTable.find(*parserToken->sType.lex.string); - if (afterType == false && parserToken->sType.lex.symbol) { + if ((afterType == false && afterStruct == false) && parserToken->sType.lex.symbol != nullptr) { if (const TVariable* variable = parserToken->sType.lex.symbol->getAsVariable()) { if (variable->isUserType()) { afterType = true; diff --git a/glslang/MachineIndependent/ScanContext.h b/glslang/MachineIndependent/ScanContext.h old mode 100644 new mode 100755 index 608ae067e072e6041870a830bf3f59d94af0862f..0cc7ea0a9ebfbda380cb3076d6323246566db5d2 --- a/glslang/MachineIndependent/ScanContext.h +++ b/glslang/MachineIndependent/ScanContext.h @@ -50,7 +50,10 @@ class TParserToken; class TScanContext { public: - explicit TScanContext(TParseContextBase& pc) : parseContext(pc), afterType(false), field(false) { } + explicit TScanContext(TParseContextBase& pc) : + parseContext(pc), + afterType(false), afterStruct(false), + field(false) { } virtual ~TScanContext() { } static void fillInKeywordMap(); @@ -76,6 +79,7 @@ protected: TParseContextBase& parseContext; bool afterType; // true if we've recognized a type, so can only be looking for an identifier + bool afterStruct; // true if we've recognized the STRUCT keyword, so can only be looking for an identifier bool field; // true if we're on a field, right after a '.' TSourceLoc loc; TParserToken* parserToken;