Fix issue #388.
Protect more against error recovery of bad built-in variable redeclarations.
This commit is contained in:
parent
31a51becd2
commit
f2cfe27021
@ -192,6 +192,8 @@ void foo213()
|
|||||||
gl_ClipDistance[1] = 0.3; // ERROR
|
gl_ClipDistance[1] = 0.3; // ERROR
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int gl_ModelViewMatrix[] = 0;
|
||||||
|
|
||||||
// token pasting (ERRORS...)
|
// token pasting (ERRORS...)
|
||||||
|
|
||||||
#define mac abc##def
|
#define mac abc##def
|
||||||
|
@ -75,10 +75,11 @@ ERROR: 0:191: '=' : cannot convert from 'temp float' to 'temp int'
|
|||||||
ERROR: 0:192: 'gl_ClipDistance' : undeclared identifier
|
ERROR: 0:192: 'gl_ClipDistance' : undeclared identifier
|
||||||
ERROR: 0:192: 'gl_ClipDistance' : left of '[' is not of type array, matrix, or vector
|
ERROR: 0:192: 'gl_ClipDistance' : left of '[' is not of type array, matrix, or vector
|
||||||
ERROR: 0:192: 'assign' : l-value required (can't modify a const)
|
ERROR: 0:192: 'assign' : l-value required (can't modify a const)
|
||||||
ERROR: 0:198: 'token pasting (##)' : not supported for this version or the enabled extensions
|
ERROR: 0:195: 'gl_ModelViewMatrix' : identifiers starting with "gl_" are reserved
|
||||||
ERROR: 0:198: '##' : token pasting not implemented (internal error)
|
ERROR: 0:200: 'token pasting (##)' : not supported for this version or the enabled extensions
|
||||||
ERROR: 0:198: '' : syntax error
|
ERROR: 0:200: '##' : token pasting not implemented (internal error)
|
||||||
ERROR: 79 compilation errors. No code generated.
|
ERROR: 0:200: '' : syntax error
|
||||||
|
ERROR: 80 compilation errors. No code generated.
|
||||||
|
|
||||||
|
|
||||||
Shader version: 120
|
Shader version: 120
|
||||||
|
@ -3175,12 +3175,13 @@ void TParseContext::arrayDimMerge(TType& type, const TArraySizes* sizes)
|
|||||||
//
|
//
|
||||||
void TParseContext::declareArray(const TSourceLoc& loc, TString& identifier, const TType& type, TSymbol*& symbol, bool& newDeclaration)
|
void TParseContext::declareArray(const TSourceLoc& loc, TString& identifier, const TType& type, TSymbol*& symbol, bool& newDeclaration)
|
||||||
{
|
{
|
||||||
if (! symbol) {
|
if (symbol == nullptr) {
|
||||||
bool currentScope;
|
bool currentScope;
|
||||||
symbol = symbolTable.find(identifier, nullptr, ¤tScope);
|
symbol = symbolTable.find(identifier, nullptr, ¤tScope);
|
||||||
|
|
||||||
if (symbol && builtInName(identifier) && ! symbolTable.atBuiltInLevel()) {
|
if (symbol && builtInName(identifier) && ! symbolTable.atBuiltInLevel()) {
|
||||||
// bad shader (errors already reported) trying to redeclare a built-in name as an array
|
// bad shader (errors already reported) trying to redeclare a built-in name as an array
|
||||||
|
symbol = nullptr;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (symbol == nullptr || ! currentScope) {
|
if (symbol == nullptr || ! currentScope) {
|
||||||
@ -3213,7 +3214,7 @@ void TParseContext::declareArray(const TSourceLoc& loc, TString& identifier, con
|
|||||||
// Process a redeclaration.
|
// Process a redeclaration.
|
||||||
//
|
//
|
||||||
|
|
||||||
if (! symbol) {
|
if (symbol == nullptr) {
|
||||||
error(loc, "array variable name expected", identifier.c_str(), "");
|
error(loc, "array variable name expected", identifier.c_str(), "");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -4934,7 +4935,7 @@ TIntermNode* TParseContext::declareVariable(const TSourceLoc& loc, TString& iden
|
|||||||
// Check for redeclaration of built-ins and/or attempting to declare a reserved name
|
// Check for redeclaration of built-ins and/or attempting to declare a reserved name
|
||||||
bool newDeclaration = false; // true if a new entry gets added to the symbol table
|
bool newDeclaration = false; // true if a new entry gets added to the symbol table
|
||||||
TSymbol* symbol = redeclareBuiltinVariable(loc, identifier, type.getQualifier(), publicType.shaderQualifiers, newDeclaration);
|
TSymbol* symbol = redeclareBuiltinVariable(loc, identifier, type.getQualifier(), publicType.shaderQualifiers, newDeclaration);
|
||||||
if (! symbol)
|
if (symbol == nullptr)
|
||||||
reservedErrorCheck(loc, identifier);
|
reservedErrorCheck(loc, identifier);
|
||||||
|
|
||||||
inheritGlobalDefaults(type.getQualifier());
|
inheritGlobalDefaults(type.getQualifier());
|
||||||
@ -4959,18 +4960,18 @@ TIntermNode* TParseContext::declareVariable(const TSourceLoc& loc, TString& iden
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// non-array case
|
// non-array case
|
||||||
if (! symbol)
|
if (symbol == nullptr)
|
||||||
symbol = declareNonArray(loc, identifier, type, newDeclaration);
|
symbol = declareNonArray(loc, identifier, type, newDeclaration);
|
||||||
else if (type != symbol->getType())
|
else if (type != symbol->getType())
|
||||||
error(loc, "cannot change the type of", "redeclaration", symbol->getName().c_str());
|
error(loc, "cannot change the type of", "redeclaration", symbol->getName().c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (! symbol)
|
if (symbol == nullptr)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
// Deal with initializer
|
// Deal with initializer
|
||||||
TIntermNode* initNode = nullptr;
|
TIntermNode* initNode = nullptr;
|
||||||
if (symbol && initializer) {
|
if (symbol != nullptr && initializer) {
|
||||||
TVariable* variable = symbol->getAsVariable();
|
TVariable* variable = symbol->getAsVariable();
|
||||||
if (! variable) {
|
if (! variable) {
|
||||||
error(loc, "initializer requires a variable, not a member", identifier.c_str(), "");
|
error(loc, "initializer requires a variable, not a member", identifier.c_str(), "");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user