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)