translator: Fix two bugs that trigger ASSERTs.
The first bug was a result of constant-folding a vector swizzle that
was out-of-bounds. The second bug was a result of using a semicolon
in a preprocessor define.
BUG=angleproject:1425
Change-Id: Id6643b1f3e3b13cc021bd721ef2572487fe3c8d3
Reviewed-on: https://chromium-review.googlesource.com/357864
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
diff --git a/src/compiler/translator/ParseContext.cpp b/src/compiler/translator/ParseContext.cpp
index 9e836d1..30bc079 100644
--- a/src/compiler/translator/ParseContext.cpp
+++ b/src/compiler/translator/ParseContext.cpp
@@ -1899,7 +1899,14 @@
}
const TLayoutQualifier layoutQualifier = typeQualifier.layoutQualifier;
- ASSERT(!layoutQualifier.isEmpty());
+
+ // It should never be the case, but some strange parser errors can send us here.
+ if (layoutQualifier.isEmpty())
+ {
+ error(typeQualifier.line, "Error during layout qualifier parsing.", "?");
+ recover();
+ return;
+ }
if (mShaderVersion < 300)
{
@@ -2469,21 +2476,22 @@
ASSERT(unionArray);
TConstantUnion *constArray = new TConstantUnion[fields.num];
+ const auto &type = node->getType();
for (int i = 0; i < fields.num; i++)
{
- if (fields.offsets[i] >= node->getType().getNominalSize())
+ if (fields.offsets[i] >= type.getNominalSize())
{
std::stringstream extraInfoStream;
extraInfoStream << "vector field selection out of range '" << fields.offsets[i] << "'";
std::string extraInfo = extraInfoStream.str();
outOfRangeError(outOfRangeIndexIsError, line, "", "[", extraInfo.c_str());
- fields.offsets[i] = node->getType().getNominalSize() - 1;
+ fields.offsets[i] = type.getNominalSize() - 1;
}
constArray[i] = unionArray[fields.offsets[i]];
}
- return intermediate.addConstantUnion(constArray, node->getType(), line);
+ return intermediate.addConstantUnion(constArray, type, line);
}
//
@@ -3056,7 +3064,7 @@
// Note that the qualifier set here will be corrected later.
indexedExpression->setType(TType(baseExpression->getBasicType(),
baseExpression->getPrecision(), EvqTemporary,
- (unsigned char)(fieldString).size()));
+ static_cast<unsigned char>(fields.num)));
}
}
else if (baseExpression->getBasicType() == EbtStruct)