Commit 664ad418 by John Kessenich

Fix #1879: Check for valid variable before checking for unsized arrays.

The order of error checking was not quite being correct (maybe there is no correct ordering, when many checks must be done and they affect each other). So, check for block-name reuse twice.
parent 34953810
...@@ -47,4 +47,5 @@ void barWxyz() ...@@ -47,4 +47,5 @@ void barWxyz()
int primitiveID() int primitiveID()
{ {
return gl_PrimitiveID; return gl_PrimitiveID;
gl_PerFragment; // ERROR, block name can't get reused
} }
...@@ -3,7 +3,9 @@ ERROR: 0:4: 'redeclaration' : cannot redeclare with different qualification: gl_ ...@@ -3,7 +3,9 @@ ERROR: 0:4: 'redeclaration' : cannot redeclare with different qualification: gl_
ERROR: 0:5: 'redeclaration' : cannot redeclare with different qualification: gl_FragCoord ERROR: 0:5: 'redeclaration' : cannot redeclare with different qualification: gl_FragCoord
ERROR: 0:6: 'layout qualifier' : can only apply origin_upper_left and pixel_center_origin to gl_FragCoord ERROR: 0:6: 'layout qualifier' : can only apply origin_upper_left and pixel_center_origin to gl_FragCoord
ERROR: 0:14: 'gl_FragCoord' : cannot redeclare after use ERROR: 0:14: 'gl_FragCoord' : cannot redeclare after use
ERROR: 4 compilation errors. No code generated. ERROR: 0:50: 'gl_PerFragment' : cannot be used (maybe an instance name is needed)
ERROR: 0:50: 'gl_PerFragment' : undeclared identifier
ERROR: 6 compilation errors. No code generated.
Shader version: 150 Shader version: 150
...@@ -106,6 +108,7 @@ ERROR: node is still EOpNull! ...@@ -106,6 +108,7 @@ ERROR: node is still EOpNull!
0:49 Sequence 0:49 Sequence
0:49 Branch: Return with expression 0:49 Branch: Return with expression
0:49 'gl_PrimitiveID' ( flat in int PrimitiveID) 0:49 'gl_PrimitiveID' ( flat in int PrimitiveID)
0:50 'gl_PerFragment' ( temp float)
0:? Linker Objects 0:? Linker Objects
0:? 'gl_FragCoord' ( gl_FragCoord 4-component vector of float FragCoord) 0:? 'gl_FragCoord' ( gl_FragCoord 4-component vector of float FragCoord)
0:? 'foo' ( smooth in 4-component vector of float) 0:? 'foo' ( smooth in 4-component vector of float)
......
...@@ -1661,6 +1661,8 @@ public: ...@@ -1661,6 +1661,8 @@ public:
virtual bool isImage() const { return basicType == EbtSampler && getSampler().isImage(); } virtual bool isImage() const { return basicType == EbtSampler && getSampler().isImage(); }
virtual bool isSubpass() const { return basicType == EbtSampler && getSampler().isSubpass(); } virtual bool isSubpass() const { return basicType == EbtSampler && getSampler().isSubpass(); }
virtual bool isTexture() const { return basicType == EbtSampler && getSampler().isTexture(); } virtual bool isTexture() const { return basicType == EbtSampler && getSampler().isTexture(); }
// Check the block-name convention of creating a block without populating it's members:
virtual bool isUnusableName() const { return isStruct() && structure == nullptr; }
virtual bool isParameterized() const { return typeParameters != nullptr; } virtual bool isParameterized() const { return typeParameters != nullptr; }
#ifdef GLSLANG_WEB #ifdef GLSLANG_WEB
bool isAtomic() const { return false; } bool isAtomic() const { return false; }
......
...@@ -319,10 +319,15 @@ TIntermTyped* TParseContext::handleVariable(const TSourceLoc& loc, TSymbol* symb ...@@ -319,10 +319,15 @@ TIntermTyped* TParseContext::handleVariable(const TSourceLoc& loc, TSymbol* symb
// If this is a variable or a block, check it and all it contains, but if this // If this is a variable or a block, check it and all it contains, but if this
// is a member of an anonymous block, check the whole block, as the whole block // is a member of an anonymous block, check the whole block, as the whole block
// will need to be copied up if it contains an unsized array. // will need to be copied up if it contains an unsized array.
if (symbol->getType().containsUnsizedArray() || //
(symbol->getAsAnonMember() && // This check is being done before the block-name check further down, so guard
symbol->getAsAnonMember()->getAnonContainer().getType().containsUnsizedArray())) // for that too.
makeEditable(symbol); if (!symbol->getType().isUnusableName()) {
if (symbol->getType().containsUnsizedArray() ||
(symbol->getAsAnonMember() &&
symbol->getAsAnonMember()->getAnonContainer().getType().containsUnsizedArray()))
makeEditable(symbol);
}
} }
#endif #endif
...@@ -347,8 +352,7 @@ TIntermTyped* TParseContext::handleVariable(const TSourceLoc& loc, TSymbol* symb ...@@ -347,8 +352,7 @@ TIntermTyped* TParseContext::handleVariable(const TSourceLoc& loc, TSymbol* symb
// See if it was a variable. // See if it was a variable.
variable = symbol ? symbol->getAsVariable() : nullptr; variable = symbol ? symbol->getAsVariable() : nullptr;
if (variable) { if (variable) {
if ((variable->getType().getBasicType() == EbtBlock || if (variable->getType().isUnusableName()) {
variable->getType().getBasicType() == EbtStruct) && variable->getType().getStruct() == nullptr) {
error(loc, "cannot be used (maybe an instance name is needed)", string->c_str(), ""); error(loc, "cannot be used (maybe an instance name is needed)", string->c_str(), "");
variable = nullptr; variable = nullptr;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment