Make TVariable type immutable

This enables using constexpr types for built-in variables and some of
the variables created in AST transformations.

BUG=angleproject:2267
TEST=angle_unittests

Change-Id: Ie85b3c9872a071a7c023ced013b14ad91cff7cee
Reviewed-on: https://chromium-review.googlesource.com/868134
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
diff --git a/src/compiler/translator/SymbolTable.cpp b/src/compiler/translator/SymbolTable.cpp
index 8e4b8b2..90a88cd 100644
--- a/src/compiler/translator/SymbolTable.cpp
+++ b/src/compiler/translator/SymbolTable.cpp
@@ -14,7 +14,6 @@
 #include "compiler/translator/SymbolTable.h"
 
 #include "compiler/translator/IntermNode.h"
-#include "compiler/translator/StaticType.h"
 
 #include <stdio.h>
 #include <algorithm>
@@ -223,24 +222,22 @@
     return insert(currentLevel(), interfaceBlock);
 }
 
-TVariable *TSymbolTable::insertVariable(ESymbolLevel level, const char *name, const TType &type)
+TVariable *TSymbolTable::insertVariable(ESymbolLevel level, const char *name, const TType *type)
 {
     ASSERT(level <= LAST_BUILTIN_LEVEL);
+    ASSERT(type->isRealized());
     return insertVariable(level, NewPoolTString(name), type, SymbolType::BuiltIn);
 }
 
 TVariable *TSymbolTable::insertVariable(ESymbolLevel level,
                                         const TString *name,
-                                        const TType &type,
+                                        const TType *type,
                                         SymbolType symbolType)
 {
+    ASSERT(level > LAST_BUILTIN_LEVEL || type->isRealized());
     TVariable *var = new TVariable(this, name, type, symbolType);
     if (insert(level, var))
     {
-        if (level <= LAST_BUILTIN_LEVEL)
-        {
-            var->getType().realize();
-        }
         return var;
     }
     return nullptr;
@@ -249,15 +246,13 @@
 TVariable *TSymbolTable::insertVariableExt(ESymbolLevel level,
                                            TExtension ext,
                                            const char *name,
-                                           const TType &type)
+                                           const TType *type)
 {
+    ASSERT(level <= LAST_BUILTIN_LEVEL);
+    ASSERT(type->isRealized());
     TVariable *var = new TVariable(this, NewPoolTString(name), type, SymbolType::BuiltIn, ext);
     if (insert(level, var))
     {
-        if (level <= LAST_BUILTIN_LEVEL)
-        {
-            var->getType().realize();
-        }
         return var;
     }
     return nullptr;
@@ -266,6 +261,7 @@
 bool TSymbolTable::insertVariable(ESymbolLevel level, TVariable *variable)
 {
     ASSERT(variable);
+    ASSERT(level > LAST_BUILTIN_LEVEL || variable->getType().isRealized());
     return insert(level, variable);
 }