Split TIntermBlock from TIntermAggregate

The new TIntermBlock node class replaces TIntermAggregate nodes with
the EOpSequence op. It represents the root node of the tree which is
a list of declarations and function definitions, and any code blocks
that can be denoted by curly braces. These include function and loop
bodies, and if-else branches.

This change enables a bunch of more compile-time type checking, and
makes the AST code easier to understand and less error-prone.

The PostProcess step that used to be done to ensure that the root node
is TIntermAggregate is removed in favor of making sure that the root
node is a TIntermBlock in the glslang.y parsing code.

Intermediate output formatting is improved to print the EOpNull error
in a clearer way.

After this patch, TIntermAggregate is still used for function
definitions, function prototypes, function parameter lists, function
calls, variable and invariant declarations and the comma (sequence)
operator.

BUG=angleproject:1490
TEST=angle_unittests, angle_end2end_tests

Change-Id: I04044affff979a11577bc1fe75d747e538b799c8
Reviewed-on: https://chromium-review.googlesource.com/393726
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
diff --git a/src/compiler/translator/ParseContext.cpp b/src/compiler/translator/ParseContext.cpp
index 99d6968..36a2d84 100644
--- a/src/compiler/translator/ParseContext.cpp
+++ b/src/compiler/translator/ParseContext.cpp
@@ -2060,7 +2060,7 @@
 
 TIntermAggregate *TParseContext::addFunctionDefinition(const TFunction &function,
                                                        TIntermAggregate *functionPrototype,
-                                                       TIntermAggregate *functionBody,
+                                                       TIntermBlock *functionBody,
                                                        const TSourceLoc &location)
 {
     // Check that non-void functions have at least one return statement.
@@ -2077,7 +2077,7 @@
 
     if (functionBody == nullptr)
     {
-        functionBody = new TIntermAggregate(EOpSequence);
+        functionBody = new TIntermBlock();
         functionBody->setLine(location);
     }
     functionNode->getSequence()->push_back(functionBody);
@@ -3085,7 +3085,7 @@
 }
 
 TIntermSwitch *TParseContext::addSwitch(TIntermTyped *init,
-                                        TIntermAggregate *statementList,
+                                        TIntermBlock *statementList,
                                         const TSourceLoc &loc)
 {
     TBasicType switchType = init->getBasicType();