Make aggregate node creation more robust

Now aggregate nodes are always built with their return type, op and
arguments set. They'll determine their qualifier and precision
automatically.

This fixes setting of gotPrecisionFromChildren in a few cases.

This will also make it easier to split TIntermAggregate further into
specialized classes if that is desired.

BUG=angleproject:1490
TEST=angle_unittests

Change-Id: I1fbe0c75679c517a22d44dfc1ea160ad7a7fdfda
Reviewed-on: https://chromium-review.googlesource.com/433468
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
diff --git a/src/compiler/translator/RemoveDynamicIndexing.cpp b/src/compiler/translator/RemoveDynamicIndexing.cpp
index fbe0264..7424f39 100644
--- a/src/compiler/translator/RemoveDynamicIndexing.cpp
+++ b/src/compiler/translator/RemoveDynamicIndexing.cpp
@@ -113,11 +113,9 @@
     if (node->getBasicType() == EbtInt)
         return node;
 
-    TIntermAggregate *convertedNode = new TIntermAggregate(EOpConstructInt);
-    convertedNode->setType(TType(EbtInt));
-    convertedNode->getSequence()->push_back(node);
-    convertedNode->setPrecisionFromChildren();
-    return convertedNode;
+    TIntermSequence *arguments = new TIntermSequence();
+    arguments->push_back(node);
+    return new TIntermAggregate(TType(EbtInt), EOpConstructInt, arguments);
 }
 
 TType GetFieldType(const TType &indexedType)
@@ -351,15 +349,16 @@
                                           TIntermTyped *index)
 {
     ASSERT(node->getOp() == EOpIndexIndirect);
-    TIntermAggregate *indexingCall = new TIntermAggregate(EOpCallFunctionInAST);
+    TIntermSequence *arguments = new TIntermSequence();
+    arguments->push_back(indexedNode);
+    arguments->push_back(index);
+
+    TType fieldType = GetFieldType(indexedNode->getType());
+    TIntermAggregate *indexingCall =
+        new TIntermAggregate(fieldType, EOpCallFunctionInAST, arguments);
     indexingCall->setLine(node->getLine());
     indexingCall->getFunctionSymbolInfo()->setNameObj(
         GetIndexFunctionName(indexedNode->getType(), false));
-    indexingCall->getSequence()->push_back(indexedNode);
-    indexingCall->getSequence()->push_back(index);
-
-    TType fieldType = GetFieldType(indexedNode->getType());
-    indexingCall->setType(fieldType);
     return indexingCall;
 }