Always emit precision in shader variable declarations.

After the shader compile (and before code output), the precision scopes are already lost.  In order to correctly output precisions, we need to emit precision in each variable declaration, therefore, each variable should have its precision set.  This CL fixes the bugs that the precisions are lost for variables using default precsions and struct fields.  Also, this CL fixes a bug in the grammar: constructors are not type_specifier and they shouldn't have precisions.

BUG=168
TEST=webgl conformance tests, gles2 conformance tests.
Review URL: http://codereview.appspot.com/4617041

git-svn-id: https://angleproject.googlecode.com/svn/trunk@695 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/compiler/Compiler.cpp b/src/compiler/Compiler.cpp
index 655d62d..5d86a3e 100644
--- a/src/compiler/Compiler.cpp
+++ b/src/compiler/Compiler.cpp
@@ -18,7 +18,9 @@
 {
     TIntermediate intermediate(infoSink);
     TExtensionBehavior extBehavior;
-    TParseContext parseContext(symbolTable, extBehavior, intermediate, type, spec, 0, NULL, infoSink);
+    // The builtins deliberately don't specify precisions for the function
+    // arguments and return types. For that reason we don't try to check them.
+    TParseContext parseContext(symbolTable, extBehavior, intermediate, type, spec, 0, false, NULL, infoSink);
 
     GlobalParseContext = &parseContext;
 
@@ -127,7 +129,7 @@
 
     TIntermediate intermediate(infoSink);
     TParseContext parseContext(symbolTable, extensionBehavior, intermediate,
-                               shaderType, shaderSpec, compileOptions,
+                               shaderType, shaderSpec, compileOptions, true,
                                sourcePath, infoSink);
     GlobalParseContext = &parseContext;
 
diff --git a/src/compiler/ParseHelper.cpp b/src/compiler/ParseHelper.cpp
index 3874843..3f0836d 100644
--- a/src/compiler/ParseHelper.cpp
+++ b/src/compiler/ParseHelper.cpp
@@ -261,6 +261,8 @@
 }
 
 bool TParseContext::precisionErrorCheck(int line, TPrecision precision, TBasicType type){
+    if (!checksPrecisionErrors)
+        return false;
     switch( type ){
     case EbtFloat:
         if( precision == EbpUndefined ){
diff --git a/src/compiler/ParseHelper.h b/src/compiler/ParseHelper.h
index 0cc0728..8637d89 100644
--- a/src/compiler/ParseHelper.h
+++ b/src/compiler/ParseHelper.h
@@ -30,8 +30,8 @@
 // they can be passed to the parser without needing a global.
 //
 struct TParseContext {
-    TParseContext(TSymbolTable& symt, TExtensionBehavior& ext, TIntermediate& interm, ShShaderType type, ShShaderSpec spec, int options, const char* sourcePath, TInfoSink& is) :
-            intermediate(interm), symbolTable(symt), extensionBehavior(ext), infoSink(is), shaderType(type), shaderSpec(spec), compileOptions(options), sourcePath(sourcePath), treeRoot(0),
+    TParseContext(TSymbolTable& symt, TExtensionBehavior& ext, TIntermediate& interm, ShShaderType type, ShShaderSpec spec, int options, bool checksPrecErrors, const char* sourcePath, TInfoSink& is) :
+            intermediate(interm), symbolTable(symt), extensionBehavior(ext), infoSink(is), shaderType(type), shaderSpec(spec), compileOptions(options), checksPrecisionErrors(checksPrecErrors), sourcePath(sourcePath), treeRoot(0),
             recoveredFromError(false), numErrors(0), lexAfterType(false), loopNestingLevel(0),
             inTypeParen(false), scanner(NULL), contextPragma(true, false) {  }
     TIntermediate& intermediate; // to hold and build a parse tree
@@ -50,6 +50,7 @@
     bool inTypeParen;            // true if in parentheses, looking only for an identifier
     const TType* currentFunctionType;  // the return type of the function that's currently being parsed
     bool functionReturnsValue;   // true if a non-void function has a return
+    bool checksPrecisionErrors;  // true if an error will be generated when a variable is declared without precision, explicit or implicit.
 
     void error(TSourceLoc loc, const char *reason, const char* token,
                const char* extraInfoFormat, ...);
diff --git a/src/compiler/TranslatorESSL.cpp b/src/compiler/TranslatorESSL.cpp
index 62b645f..bb201a4 100644
--- a/src/compiler/TranslatorESSL.cpp
+++ b/src/compiler/TranslatorESSL.cpp
@@ -18,18 +18,6 @@
     // Write built-in extension behaviors.
     writeExtensionBehavior();
 
-    // FIXME(zmo): no need to emit default precision if all variables emit
-    // their own precision.
-    // http://code.google.com/p/angleproject/issues/detail?id=168
-    if (this->getShaderType() == SH_FRAGMENT_SHADER) {
-        // Write default float precision.
-        sink << "#if defined(GL_FRAGMENT_PRECISION_HIGH)\n"
-             << "precision highp float;\n"
-             << "#else\n"
-             << "precision mediump float;\n"
-             << "#endif\n";
-    }
-
     // Write translated shader.
     TOutputESSL outputESSL(sink);
     root->traverse(&outputESSL);
diff --git a/src/compiler/glslang.y b/src/compiler/glslang.y
index b6fa163..d05f441 100644
--- a/src/compiler/glslang.y
+++ b/src/compiler/glslang.y
@@ -591,17 +591,10 @@
 // Grammar Note:  Constructors look like functions, but are recognized as types.
 
 function_identifier
-    : type_specifier {
+    : type_specifier_nonarray {
         //
         // Constructor
         //
-        if ($1.array) {
-            // Constructors for arrays are not allowed.
-            context->error($1.line, "cannot construct this type", "array", "");
-            context->recover();
-            $1.setArray(false);
-        }
-
         TOperator op = EOpNull;
         if ($1.userDef) {
             op = EOpConstructStruct;
@@ -1176,13 +1169,6 @@
 init_declarator_list
     : single_declaration {
         $$ = $1;
-        
-        if ($$.type.precision == EbpUndefined) {
-            $$.type.precision = context->symbolTable.getDefaultPrecision($1.type.type);
-            if (context->precisionErrorCheck($1.line, $$.type.precision, $1.type.type)) {
-                context->recover();
-            }
-        }
     }
     | init_declarator_list COMMA IDENTIFIER {
         TIntermSymbol* symbol = context->intermediate.addSymbol(0, *$3.string, TType($1.type), $3.line);
@@ -1490,6 +1476,13 @@
 type_specifier
     : type_specifier_no_prec {
         $$ = $1;
+
+        if ($$.precision == EbpUndefined) {
+            $$.precision = context->symbolTable.getDefaultPrecision($1.type);
+            if (context->precisionErrorCheck($1.line, $$.precision, $1.type)) {
+                context->recover();
+            }
+        }
     }
     | precision_qualifier type_specifier_no_prec {
         $$ = $2;
@@ -1693,6 +1686,7 @@
             type->setBasicType($1.type);
             type->setNominalSize($1.size);
             type->setMatrix($1.matrix);
+            type->setPrecision($1.precision);
 
             // don't allow arrays of arrays
             if (type->isArray()) {
diff --git a/src/compiler/glslang_tab.cpp b/src/compiler/glslang_tab.cpp
index 83ac524..47ca2ee 100644
--- a/src/compiler/glslang_tab.cpp
+++ b/src/compiler/glslang_tab.cpp
@@ -580,7 +580,7 @@
 /* YYFINAL -- State number of the termination state.  */
 #define YYFINAL  69
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   1334
+#define YYLAST   1362
 
 /* YYNTOKENS -- Number of terminals.  */
 #define YYNTOKENS  94
@@ -674,7 +674,7 @@
       97,    51,    -1,    97,    52,    -1,   122,    -1,   100,    -1,
      101,    -1,    97,    76,   101,    -1,   103,    71,    -1,   102,
       71,    -1,   104,    39,    -1,   104,    -1,   104,   120,    -1,
-     103,    77,   120,    -1,   105,    70,    -1,   137,    -1,    43,
+     103,    77,   120,    -1,   105,    70,    -1,   140,    -1,    43,
       -1,    48,    -1,    97,    -1,    51,   106,    -1,    52,   106,
       -1,   107,   106,    -1,    84,    -1,    82,    -1,    81,    -1,
      106,    -1,   108,    85,   106,    -1,   108,    86,   106,    -1,
@@ -731,24 +731,24 @@
 {
        0,   153,   153,   188,   191,   204,   209,   214,   220,   223,
      296,   299,   408,   418,   431,   439,   538,   541,   549,   553,
-     560,   564,   571,   577,   586,   594,   656,   663,   673,   676,
-     686,   696,   717,   718,   719,   724,   725,   734,   746,   747,
-     755,   766,   770,   771,   781,   791,   801,   814,   815,   825,
-     838,   842,   846,   850,   851,   864,   865,   878,   879,   892,
-     893,   910,   911,   924,   925,   926,   927,   928,   932,   935,
-     946,   954,   979,   984,   991,  1027,  1030,  1037,  1045,  1066,
-    1085,  1096,  1125,  1130,  1140,  1145,  1155,  1158,  1161,  1164,
-    1170,  1177,  1187,  1203,  1221,  1245,  1268,  1272,  1290,  1298,
-    1330,  1350,  1426,  1435,  1458,  1461,  1467,  1475,  1483,  1491,
-    1494,  1501,  1504,  1507,  1513,  1516,  1531,  1535,  1539,  1543,
-    1552,  1557,  1562,  1567,  1572,  1577,  1582,  1587,  1592,  1597,
-    1603,  1609,  1615,  1620,  1625,  1630,  1643,  1656,  1664,  1667,
-    1682,  1713,  1717,  1723,  1731,  1747,  1751,  1755,  1756,  1762,
-    1763,  1764,  1765,  1766,  1770,  1771,  1771,  1771,  1781,  1782,
-    1787,  1790,  1800,  1803,  1809,  1810,  1814,  1822,  1826,  1836,
-    1841,  1858,  1858,  1863,  1863,  1870,  1870,  1878,  1881,  1887,
-    1890,  1896,  1900,  1907,  1914,  1921,  1928,  1939,  1948,  1952,
-    1959,  1962,  1968,  1968
+     560,   564,   571,   577,   586,   594,   649,   656,   666,   669,
+     679,   689,   710,   711,   712,   717,   718,   727,   739,   740,
+     748,   759,   763,   764,   774,   784,   794,   807,   808,   818,
+     831,   835,   839,   843,   844,   857,   858,   871,   872,   885,
+     886,   903,   904,   917,   918,   919,   920,   921,   925,   928,
+     939,   947,   972,   977,   984,  1020,  1023,  1030,  1038,  1059,
+    1078,  1089,  1118,  1123,  1133,  1138,  1148,  1151,  1154,  1157,
+    1163,  1170,  1173,  1189,  1207,  1231,  1254,  1258,  1276,  1284,
+    1316,  1336,  1412,  1421,  1444,  1447,  1453,  1461,  1469,  1477,
+    1487,  1494,  1497,  1500,  1506,  1509,  1524,  1528,  1532,  1536,
+    1545,  1550,  1555,  1560,  1565,  1570,  1575,  1580,  1585,  1590,
+    1596,  1602,  1608,  1613,  1618,  1623,  1636,  1649,  1657,  1660,
+    1675,  1707,  1711,  1717,  1725,  1741,  1745,  1749,  1750,  1756,
+    1757,  1758,  1759,  1760,  1764,  1765,  1765,  1765,  1775,  1776,
+    1781,  1784,  1794,  1797,  1803,  1804,  1808,  1816,  1820,  1830,
+    1835,  1852,  1852,  1857,  1857,  1864,  1864,  1872,  1875,  1881,
+    1884,  1890,  1894,  1901,  1908,  1915,  1922,  1933,  1942,  1946,
+    1953,  1956,  1962,  1962
 };
 #endif
 
@@ -892,10 +892,10 @@
       38,    41,    42,    47,    50,    51,    52,    53,    55,    57,
       59,    70,     0,    25,    73,     0,   143,     0,   141,   137,
      139,     0,     0,   173,     0,     0,     0,     0,     0,   155,
-     160,   164,    35,    61,    68,     0,   146,     0,   102,   149,
+     160,   164,    35,    61,    68,     0,   146,     0,   114,   149,
      162,   148,   147,     0,   150,   151,   152,   153,    80,    82,
       84,     0,     0,    98,     0,   145,   100,    29,    30,     0,
-      12,    13,     0,     0,    19,    18,     0,   116,    22,    24,
+      12,    13,     0,     0,    19,    18,     0,    20,    22,    24,
       31,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,   115,   136,     0,     0,   140,
      184,   183,     0,   175,     0,   187,   185,     0,   171,   154,
@@ -917,7 +917,7 @@
      106,   107,   142,   109,   110,   111,   112,   113,   114,   115,
      116,   117,   118,   119,   120,   143,   144,   216,   145,   122,
      146,   147,    32,    33,    34,    79,    60,    61,    80,    35,
-      36,    37,    38,   123,    40,    41,    42,    43,    74,    75,
+      36,    37,    38,    39,    40,    41,   123,    43,    74,    75,
      127,   128,   166,   149,   150,   151,   152,   210,   270,   288,
      289,   153,   154,   155,   278,   269,   156,   253,   202,   250,
      265,   275,   276,   157,    44,    45,    46,    53
@@ -928,86 +928,86 @@
 #define YYPACT_NINF -250
 static const yytype_int16 yypact[] =
 {
-    1225,    36,  -250,  -250,  -250,   150,  -250,  -250,  -250,  -250,
+    1218,   -13,  -250,  -250,  -250,   137,  -250,  -250,  -250,  -250,
     -250,  -250,  -250,  -250,  -250,  -250,  -250,  -250,  -250,  -250,
-    -250,  -250,  -250,  -250,  -250,   -33,  -250,  -250,  -250,  -250,
-    -250,   -60,   -22,   -17,    21,   -62,  -250,    22,  1266,  -250,
-    1290,  -250,    11,  -250,  1138,  -250,  -250,  -250,  -250,  1290,
-      14,  1266,  -250,    27,  -250,    34,    41,  -250,  -250,  -250,
-    -250,  1266,   129,    61,  -250,    17,  -250,  -250,   908,  -250,
-    -250,    31,  1266,    72,  1042,  -250,   283,  -250,  -250,  -250,
-    -250,    90,  1266,   -46,  -250,   194,   908,    65,  -250,  -250,
-    -250,  -250,   908,   908,   908,  -250,  -250,  -250,  -250,  -250,
-     -40,  -250,  -250,  -250,    80,   -25,   975,    87,  -250,   908,
-      35,    13,  -250,   -26,    68,  -250,  -250,  -250,   110,   109,
-     -54,  -250,    96,  -250,  -250,  1083,    98,    33,  -250,  -250,
-    -250,    91,    92,  -250,   104,   107,    99,   760,   108,   105,
-    -250,  -250,    24,  -250,  -250,    37,  -250,   -60,   112,  -250,
-    -250,  -250,  -250,   365,  -250,  -250,  -250,  -250,   111,  -250,
-    -250,   827,   908,  -250,   113,  -250,  -250,  -250,  -250,     4,
-    -250,  -250,   908,  1179,  -250,  -250,   908,   114,  -250,  -250,
-    -250,   908,   908,   908,   908,   908,   908,   908,   908,   908,
-     908,   908,   908,   908,   908,  -250,  -250,   908,    72,  -250,
-    -250,  -250,   447,  -250,   908,  -250,  -250,    42,  -250,  -250,
-     447,  -250,  -250,  -250,  -250,  -250,   908,   908,  -250,  -250,
-    -250,   908,  -250,   115,  -250,  -250,  -250,   116,   117,  -250,
-     120,  -250,  -250,  -250,  -250,    35,    35,  -250,  -250,  -250,
-    -250,   -26,   -26,  -250,   110,   109,    51,   119,  -250,   144,
-     611,    23,  -250,   693,   447,  -250,  -250,   122,  -250,  -250,
-     908,  -250,   123,  -250,  -250,   693,   447,   117,   153,   126,
-     128,  -250,  -250,   908,  -250,   127,   137,   171,  -250,   130,
-     529,  -250,    28,   908,   529,   447,   908,  -250,  -250,  -250,
-     131,   117,  -250,  -250,  -250,  -250
+    -250,  -250,  -250,  -250,  -250,   -28,  -250,  -250,  -250,  -250,
+    -250,   -55,   -38,    -4,    33,   -20,  -250,    44,  1259,  -250,
+    1318,  -250,    18,  -250,  1176,  -250,  -250,  -250,  -250,  1318,
+     -22,  1259,  -250,    29,  -250,    85,    73,  -250,  -250,  -250,
+    -250,  1259,   113,    70,  -250,    13,  -250,  -250,   949,  -250,
+    -250,    49,  1259,    90,  1080,  -250,   283,  -250,  -250,  -250,
+    -250,   101,  1259,   -56,  -250,   757,   949,    80,  -250,  -250,
+    -250,  -250,   949,   949,   949,  -250,  -250,  -250,  -250,  -250,
+     -33,  -250,  -250,  -250,    81,   -15,  1013,    92,  -250,   949,
+      52,   -75,  -250,   -25,    40,  -250,  -250,  -250,   106,   105,
+     -46,  -250,    93,  -250,  -250,  1121,    95,     9,  -250,  -250,
+    -250,    88,    89,  -250,   100,   102,    91,   821,   104,   103,
+    -250,  -250,    66,  -250,  -250,    20,  -250,   -55,    79,  -250,
+    -250,  -250,  -250,   365,  -250,  -250,  -250,  -250,   107,  -250,
+    -250,   885,   949,  -250,   109,  -250,  -250,  -250,  -250,    -6,
+    -250,  -250,   949,  1283,  -250,  -250,   949,   110,  -250,  -250,
+    -250,   949,   949,   949,   949,   949,   949,   949,   949,   949,
+     949,   949,   949,   949,   949,  -250,  -250,   949,    90,  -250,
+    -250,  -250,   447,  -250,   949,  -250,  -250,    34,  -250,  -250,
+     447,  -250,  -250,  -250,  -250,  -250,   949,   949,  -250,  -250,
+    -250,   949,  -250,   111,  -250,  -250,  -250,   112,    99,  -250,
+     116,  -250,  -250,  -250,  -250,    52,    52,  -250,  -250,  -250,
+    -250,   -25,   -25,  -250,   106,   105,    77,   114,  -250,   125,
+     611,     4,  -250,   693,   447,  -250,  -250,   115,  -250,  -250,
+     949,  -250,   119,  -250,  -250,   693,   447,    99,   134,   122,
+     108,  -250,  -250,   949,  -250,   117,   123,   174,  -250,   120,
+     529,  -250,     7,   949,   529,   447,   949,  -250,  -250,  -250,
+     118,    99,  -250,  -250,  -250,  -250
 };
 
 /* YYPGOTO[NTERM-NUM].  */
 static const yytype_int16 yypgoto[] =
 {
-    -250,  -250,  -250,  -250,  -250,  -250,  -250,    39,  -250,  -250,
-    -250,  -250,   -45,  -250,   -18,  -250,   -79,   -30,  -250,  -250,
-    -250,    38,    52,    20,  -250,   -63,   -85,  -250,   -92,   -71,
-       6,     9,  -250,  -250,  -250,   132,   172,   166,   148,  -250,
-    -250,  -246,   -21,     0,   226,   -24,  -250,  -250,   162,   -66,
-    -250,    45,  -159,    -3,  -136,  -249,  -250,  -250,  -250,   -36,
-     196,    46,     1,  -250,  -250,   -13,  -250,  -250,  -250,  -250,
-    -250,  -250,  -250,  -250,  -250,   211,  -250,  -250
+    -250,  -250,  -250,  -250,  -250,  -250,  -250,    22,  -250,  -250,
+    -250,  -250,    31,  -250,   -27,  -250,   -79,   -30,  -250,  -250,
+    -250,     5,     8,    12,  -250,   -63,   -85,  -250,   -92,   -82,
+      10,    11,  -250,  -250,  -250,   121,   149,   144,   126,  -250,
+    -250,  -233,   -21,   -24,   202,   -23,     0,  -250,   139,   -66,
+    -250,    27,  -156,   -41,  -149,  -249,  -250,  -250,  -250,   -58,
+     176,    17,   -19,  -250,  -250,   -35,  -250,  -250,  -250,  -250,
+    -250,  -250,  -250,  -250,  -250,   188,  -250,  -250
 };
 
 /* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
    positive, shift that token.  If negative, reduce the rule which
    number is the opposite.  If zero, do what YYDEFACT says.
    If YYTABLE_NINF, syntax error.  */
-#define YYTABLE_NINF -76
+#define YYTABLE_NINF -117
 static const yytype_int16 yytable[] =
 {
-      39,   165,   169,   224,   193,   121,    30,   268,   130,    31,
-      50,   170,   171,    62,   164,    63,    67,   220,    64,   268,
-      52,   178,   121,   108,    56,    71,   161,   185,   186,     6,
-       7,   287,   172,   162,    62,   287,   173,    56,    66,   194,
-     108,    51,     6,     7,    39,   207,   175,   167,   168,    54,
-      30,    73,   176,    31,    57,    58,    59,    23,    24,   130,
-      55,    81,   187,   188,   180,    65,   249,    57,    58,    59,
-      23,    24,    73,    47,    73,   226,   148,   165,    47,    48,
-     228,   217,    81,    68,   211,   212,   213,    84,    72,    85,
-     223,   232,   -75,   214,   266,   183,    86,   184,   121,   290,
-     217,    76,   246,   215,    83,   217,   237,   238,   239,   240,
-     198,   124,   251,   199,   217,   126,   108,   218,   220,   217,
-     181,   182,   252,   189,   190,    73,   247,   294,   217,   260,
-     277,   255,   256,   158,   121,   -26,   233,   234,   108,   108,
-     108,   108,   108,   108,   108,   108,   108,   108,   108,   293,
-     257,   174,   108,   148,     2,     3,     4,   179,   121,   241,
-     242,   267,    57,    58,    59,   235,   236,   191,   192,   195,
-     197,   200,   201,   267,   203,   272,   108,   204,   208,   205,
-     209,   282,   -25,   221,   262,   -20,   225,   285,   258,   259,
-     -27,   291,   261,   273,   217,   271,   279,   280,     2,     3,
-       4,   165,   148,   281,     8,     9,    10,   283,   284,   286,
-     148,   295,   231,   245,   159,    11,    12,    13,    14,    15,
-      16,    17,    18,    19,    20,    21,    22,    78,    82,   243,
-     160,    49,    25,    26,   125,    27,    28,    87,    29,    88,
-      89,    90,    91,   248,   244,    92,    93,   263,   292,    77,
-     148,   264,   274,   148,   148,    70,   254,     0,     0,     0,
-       0,     0,     0,     0,    94,   148,   148,   163,     0,     0,
-       0,     0,     0,     0,     0,    95,    96,     0,    97,     0,
+      42,   165,   169,   164,   220,   121,   224,   183,   130,   184,
+      30,    31,   193,    62,    66,    50,   161,    67,   170,   171,
+     268,   178,   121,   162,    47,    52,    71,    73,   185,   186,
+      48,   287,   268,    54,    62,   287,    56,    81,    42,   172,
+      42,     6,     7,   173,    42,   207,    51,   194,    73,    42,
+      73,    42,    72,   249,    30,    31,   175,    63,    81,   130,
+      64,    42,   176,   187,   188,   226,    57,    58,    59,    23,
+      24,   217,    42,    55,    42,   266,   148,   165,   290,   223,
+     228,   217,    42,    84,   217,    85,   198,    65,    56,   199,
+      68,   232,    86,     6,     7,   189,   190,   217,   121,   108,
+     218,    73,   246,    76,   -75,   220,   237,   238,   239,   240,
+      47,   217,   251,    83,   252,   247,   108,   277,    57,    58,
+      59,    23,    24,   167,   168,    42,   211,   212,   213,   124,
+     294,   255,   256,   126,   121,   214,   293,   181,   182,   257,
+     180,     2,     3,     4,   158,   215,    57,    58,    59,   -25,
+     -26,    68,   174,   148,   217,   260,   235,   236,   121,   241,
+     242,   267,   179,   191,   192,   262,   195,   197,   200,   201,
+     203,   205,   204,   267,   208,   272,   217,   279,   209,   221,
+    -116,   282,   225,   281,   258,   259,   -27,   261,   271,   273,
+     285,   291,   108,   280,   284,   231,   243,   283,   295,   286,
+     244,   165,   148,   159,    78,   245,    82,    49,   160,   263,
+     148,   125,   233,   234,   108,   108,   108,   108,   108,   108,
+     108,   108,   108,   108,   108,   248,   292,   254,   108,    77,
+     274,   264,    70,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     148,     0,   108,   148,   148,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   148,   148,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
      148,     0,     0,     0,   148,   148,     1,     2,     3,     4,
        5,     6,     7,     8,     9,    10,   131,   132,   133,     0,
      134,   135,   136,   137,    11,    12,    13,    14,    15,    16,
@@ -1056,96 +1056,99 @@
       24,    25,    26,     0,    27,    28,    87,    29,    88,    89,
       90,    91,     0,     0,    92,    93,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,    94,     2,     3,     4,     0,     0,     0,
-       8,     9,    10,     0,    95,    96,     0,    97,     0,     0,
-       0,    11,    12,    13,    14,    15,    16,    17,    18,    19,
-      20,    21,    22,     0,     0,     0,     0,     0,    25,    26,
-       0,    27,    28,    87,    29,    88,    89,    90,    91,     0,
-       0,    92,    93,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-      94,     2,     3,     4,     0,     0,     0,     8,     9,    10,
-     206,    95,    96,     0,    97,     0,     0,     0,    11,    12,
+       0,     0,     0,    94,     0,     0,     0,     8,     9,    10,
+       0,     0,     0,     0,    95,    96,     0,    97,    11,    12,
       13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
        0,     0,     0,     0,     0,    25,    26,     0,    27,    28,
       87,    29,    88,    89,    90,    91,     0,     0,    92,    93,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,    94,     0,     0,
-     222,     0,     0,     0,     0,     0,     0,     0,    95,    96,
-       0,    97,     2,     3,     4,     0,     0,     0,     8,     9,
-      10,     0,     0,     0,     0,     0,     0,     0,     0,    11,
-      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
-      22,     0,     0,     0,     0,     0,    25,    26,     0,    27,
-      28,    87,    29,    88,    89,    90,    91,     0,     0,    92,
-      93,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,    94,     2,
-       3,     4,     0,     0,     0,     8,     9,    10,     0,    95,
-      96,     0,    97,     0,     0,     0,    11,    12,    13,    14,
+     163,     8,     9,    10,     0,     0,     0,     0,    95,    96,
+       0,    97,    11,    12,    13,    14,    15,    16,    17,    18,
+      19,    20,    21,    22,     0,     0,     0,     0,     0,    25,
+      26,     0,    27,    28,    87,    29,    88,    89,    90,    91,
+       0,     0,    92,    93,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,    94,     0,     0,     0,     8,     9,    10,     0,     0,
+       0,   206,    95,    96,     0,    97,    11,    12,    13,    14,
       15,    16,    17,    18,    19,    20,    21,    22,     0,     0,
-       0,     0,     0,    25,   177,     0,    27,    28,    87,    29,
+       0,     0,     0,    25,    26,     0,    27,    28,    87,    29,
       88,    89,    90,    91,     0,     0,    92,    93,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,    94,     2,     3,     4,     0,
-       0,     0,     8,     9,    10,     0,    95,    96,     0,    97,
-       0,     0,     0,    11,    12,    13,    14,    15,    16,    17,
-      18,    19,    20,    21,    22,     0,     0,     0,     0,     0,
-      25,    26,     0,    27,    28,     0,    29,     2,     3,     4,
+       0,     0,     0,     0,     0,    94,     0,     0,   222,     8,
+       9,    10,     0,     0,     0,     0,    95,    96,     0,    97,
+      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
+      21,    22,     0,     0,     0,     0,     0,    25,    26,     0,
+      27,    28,    87,    29,    88,    89,    90,    91,     0,     0,
+      92,    93,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,    94,
        0,     0,     0,     8,     9,    10,     0,     0,     0,     0,
-       0,     0,     0,     0,    11,    12,    13,    14,    15,    16,
-      17,    18,    19,    20,    21,    22,     0,   129,     0,     0,
-       0,    25,    26,     0,    27,    28,     0,    29,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,    69,     0,
-       0,     1,     2,     3,     4,     5,     6,     7,     8,     9,
-      10,     0,     0,     0,     0,     0,     0,     0,   196,    11,
+      95,    96,     0,    97,    11,    12,    13,    14,    15,    16,
+      17,    18,    19,    20,    21,    22,     0,     0,     0,     0,
+       0,    25,   177,     0,    27,    28,    87,    29,    88,    89,
+      90,    91,     0,     0,    92,    93,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,    94,     2,     3,     4,     0,     0,     0,
+       8,     9,    10,     0,    95,    96,     0,    97,     0,     0,
+       0,    11,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    22,     0,     0,     0,     0,     0,    25,    26,
+       0,    27,    28,     0,    29,     2,     3,     4,     0,     0,
+       0,     8,     9,    10,     0,     0,     0,     0,     0,     0,
+       0,     0,    11,    12,    13,    14,    15,    16,    17,    18,
+      19,    20,    21,    22,     0,   129,     0,     0,     0,    25,
+      26,     0,    27,    28,     0,    29,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,    69,     0,     0,     1,
+       2,     3,     4,     5,     6,     7,     8,     9,    10,     0,
+       0,     0,     0,     0,     0,     0,   196,    11,    12,    13,
+      14,    15,    16,    17,    18,    19,    20,    21,    22,     0,
+       0,     0,    23,    24,    25,    26,     0,    27,    28,     0,
+      29,     1,     2,     3,     4,     5,     6,     7,     8,     9,
+      10,     0,     0,     0,     0,     0,     0,     0,     0,    11,
       12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
       22,     0,     0,     0,    23,    24,    25,    26,     0,    27,
       28,     0,    29,     2,     3,     4,     0,     0,     0,     8,
        9,    10,     0,     0,     0,     0,     0,     0,     0,     0,
       11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
-      21,    22,     0,     0,     0,     0,     0,    25,    26,     0,
-      27,    28,   229,    29,     0,     0,     0,   230,     1,     2,
-       3,     4,     5,     6,     7,     8,     9,    10,     0,     0,
-       0,     0,     0,     0,     0,     0,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,     0,     0,
-       0,    23,    24,    25,    26,     0,    27,    28,     0,    29,
-       2,     3,     4,     0,     0,     0,     8,     9,    10,     0,
-       0,     0,     0,     0,     0,     0,     0,    11,    12,    13,
-      14,    15,    16,    17,    18,    19,    20,    21,    22,     0,
-       8,     9,    10,     0,    25,    26,     0,    27,    28,     0,
-      29,    11,    12,    13,    14,    15,    16,    17,    18,    19,
-      20,    21,    22,     0,     0,     0,     0,     0,    25,    26,
-       0,    27,    28,     0,    29
+      21,    22,     0,     8,     9,    10,     0,    25,    26,     0,
+      27,    28,     0,    29,    11,    12,    13,    14,    15,    16,
+      17,    18,    19,    20,    21,    22,     0,     0,     0,     0,
+       0,    25,    26,     0,    27,    28,   229,    29,     8,     9,
+      10,   230,     0,     0,     0,     0,     0,     0,     0,    11,
+      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
+      22,     0,     0,     0,     0,     0,    25,    26,     0,    27,
+      28,     0,    29
 };
 
 static const yytype_int16 yycheck[] =
 {
-       0,    86,    94,   162,    58,    68,     0,   253,    74,     0,
-      43,    51,    52,    34,    85,    77,    40,   153,    80,   265,
-      80,   106,    85,    68,     3,    49,    72,    53,    54,     8,
-       9,   280,    72,    79,    55,   284,    76,     3,    38,    93,
-      85,    74,     8,     9,    44,   137,    71,    92,    93,    71,
-      44,    51,    77,    44,    33,    34,    35,    36,    37,   125,
-      77,    61,    88,    89,   109,    43,   202,    33,    34,    35,
-      36,    37,    72,    37,    74,    71,    76,   162,    37,    43,
-     172,    77,    82,    72,    60,    61,    62,    70,    74,    72,
-     161,   176,    71,    69,    71,    82,    79,    84,   161,    71,
-      77,    74,   194,    79,    43,    77,   185,   186,   187,   188,
-      77,    80,   204,    80,    77,    43,   161,    80,   254,    77,
-      85,    86,    80,    55,    56,   125,   197,   286,    77,    78,
-     266,   216,   217,    43,   197,    70,   181,   182,   183,   184,
-     185,   186,   187,   188,   189,   190,   191,   192,   193,   285,
-     221,    71,   197,   153,     4,     5,     6,    70,   221,   189,
-     190,   253,    33,    34,    35,   183,   184,    57,    59,    73,
-      72,    80,    80,   265,    70,   260,   221,    70,    70,    80,
-      75,   273,    70,    72,    40,    71,    73,    16,    73,    73,
-      70,   283,    73,    70,    77,    73,    43,    71,     4,     5,
-       6,   286,   202,    75,    10,    11,    12,    80,    71,    79,
-     210,    80,   173,   193,    82,    21,    22,    23,    24,    25,
-      26,    27,    28,    29,    30,    31,    32,    55,    62,   191,
-      82,     5,    38,    39,    72,    41,    42,    43,    44,    45,
-      46,    47,    48,   198,   192,    51,    52,   250,   284,    53,
-     250,   250,   265,   253,   254,    44,   210,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    70,   265,   266,    73,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    81,    82,    -1,    84,    -1,
+       0,    86,    94,    85,   153,    68,   162,    82,    74,    84,
+       0,     0,    58,    34,    38,    43,    72,    40,    51,    52,
+     253,   106,    85,    79,    37,    80,    49,    51,    53,    54,
+      43,   280,   265,    71,    55,   284,     3,    61,    38,    72,
+      40,     8,     9,    76,    44,   137,    74,    93,    72,    49,
+      74,    51,    74,   202,    44,    44,    71,    77,    82,   125,
+      80,    61,    77,    88,    89,    71,    33,    34,    35,    36,
+      37,    77,    72,    77,    74,    71,    76,   162,    71,   161,
+     172,    77,    82,    70,    77,    72,    77,    43,     3,    80,
+      72,   176,    79,     8,     9,    55,    56,    77,   161,    68,
+      80,   125,   194,    74,    71,   254,   185,   186,   187,   188,
+      37,    77,   204,    43,    80,   197,    85,   266,    33,    34,
+      35,    36,    37,    92,    93,   125,    60,    61,    62,    80,
+     286,   216,   217,    43,   197,    69,   285,    85,    86,   221,
+     109,     4,     5,     6,    43,    79,    33,    34,    35,    70,
+      70,    72,    71,   153,    77,    78,   183,   184,   221,   189,
+     190,   253,    70,    57,    59,    40,    73,    72,    80,    80,
+      70,    80,    70,   265,    70,   260,    77,    43,    75,    72,
+      70,   273,    73,    75,    73,    73,    70,    73,    73,    70,
+      16,   283,   161,    71,    71,   173,   191,    80,    80,    79,
+     192,   286,   202,    82,    55,   193,    62,     5,    82,   250,
+     210,    72,   181,   182,   183,   184,   185,   186,   187,   188,
+     189,   190,   191,   192,   193,   198,   284,   210,   197,    53,
+     265,   250,    44,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     250,    -1,   221,   253,   254,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   265,   266,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
      280,    -1,    -1,    -1,   284,   285,     3,     4,     5,     6,
        7,     8,     9,    10,    11,    12,    13,    14,    15,    -1,
       17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
@@ -1194,64 +1197,67 @@
       37,    38,    39,    -1,    41,    42,    43,    44,    45,    46,
       47,    48,    -1,    -1,    51,    52,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    70,     4,     5,     6,    -1,    -1,    -1,
-      10,    11,    12,    -1,    81,    82,    -1,    84,    -1,    -1,
-      -1,    21,    22,    23,    24,    25,    26,    27,    28,    29,
-      30,    31,    32,    -1,    -1,    -1,    -1,    -1,    38,    39,
-      -1,    41,    42,    43,    44,    45,    46,    47,    48,    -1,
-      -1,    51,    52,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      70,     4,     5,     6,    -1,    -1,    -1,    10,    11,    12,
-      80,    81,    82,    -1,    84,    -1,    -1,    -1,    21,    22,
+      -1,    -1,    -1,    70,    -1,    -1,    -1,    10,    11,    12,
+      -1,    -1,    -1,    -1,    81,    82,    -1,    84,    21,    22,
       23,    24,    25,    26,    27,    28,    29,    30,    31,    32,
       -1,    -1,    -1,    -1,    -1,    38,    39,    -1,    41,    42,
       43,    44,    45,    46,    47,    48,    -1,    -1,    51,    52,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    70,    -1,    -1,
-      73,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    81,    82,
-      -1,    84,     4,     5,     6,    -1,    -1,    -1,    10,    11,
-      12,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    21,
-      22,    23,    24,    25,    26,    27,    28,    29,    30,    31,
-      32,    -1,    -1,    -1,    -1,    -1,    38,    39,    -1,    41,
-      42,    43,    44,    45,    46,    47,    48,    -1,    -1,    51,
-      52,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    70,     4,
-       5,     6,    -1,    -1,    -1,    10,    11,    12,    -1,    81,
-      82,    -1,    84,    -1,    -1,    -1,    21,    22,    23,    24,
+      73,    10,    11,    12,    -1,    -1,    -1,    -1,    81,    82,
+      -1,    84,    21,    22,    23,    24,    25,    26,    27,    28,
+      29,    30,    31,    32,    -1,    -1,    -1,    -1,    -1,    38,
+      39,    -1,    41,    42,    43,    44,    45,    46,    47,    48,
+      -1,    -1,    51,    52,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    70,    -1,    -1,    -1,    10,    11,    12,    -1,    -1,
+      -1,    80,    81,    82,    -1,    84,    21,    22,    23,    24,
       25,    26,    27,    28,    29,    30,    31,    32,    -1,    -1,
       -1,    -1,    -1,    38,    39,    -1,    41,    42,    43,    44,
       45,    46,    47,    48,    -1,    -1,    51,    52,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    70,     4,     5,     6,    -1,
-      -1,    -1,    10,    11,    12,    -1,    81,    82,    -1,    84,
-      -1,    -1,    -1,    21,    22,    23,    24,    25,    26,    27,
-      28,    29,    30,    31,    32,    -1,    -1,    -1,    -1,    -1,
-      38,    39,    -1,    41,    42,    -1,    44,     4,     5,     6,
+      -1,    -1,    -1,    -1,    -1,    70,    -1,    -1,    73,    10,
+      11,    12,    -1,    -1,    -1,    -1,    81,    82,    -1,    84,
+      21,    22,    23,    24,    25,    26,    27,    28,    29,    30,
+      31,    32,    -1,    -1,    -1,    -1,    -1,    38,    39,    -1,
+      41,    42,    43,    44,    45,    46,    47,    48,    -1,    -1,
+      51,    52,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    70,
       -1,    -1,    -1,    10,    11,    12,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    21,    22,    23,    24,    25,    26,
-      27,    28,    29,    30,    31,    32,    -1,    75,    -1,    -1,
-      -1,    38,    39,    -1,    41,    42,    -1,    44,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,     0,    -1,
-      -1,     3,     4,     5,     6,     7,     8,     9,    10,    11,
-      12,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    75,    21,
+      81,    82,    -1,    84,    21,    22,    23,    24,    25,    26,
+      27,    28,    29,    30,    31,    32,    -1,    -1,    -1,    -1,
+      -1,    38,    39,    -1,    41,    42,    43,    44,    45,    46,
+      47,    48,    -1,    -1,    51,    52,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    70,     4,     5,     6,    -1,    -1,    -1,
+      10,    11,    12,    -1,    81,    82,    -1,    84,    -1,    -1,
+      -1,    21,    22,    23,    24,    25,    26,    27,    28,    29,
+      30,    31,    32,    -1,    -1,    -1,    -1,    -1,    38,    39,
+      -1,    41,    42,    -1,    44,     4,     5,     6,    -1,    -1,
+      -1,    10,    11,    12,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    21,    22,    23,    24,    25,    26,    27,    28,
+      29,    30,    31,    32,    -1,    75,    -1,    -1,    -1,    38,
+      39,    -1,    41,    42,    -1,    44,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,     0,    -1,    -1,     3,
+       4,     5,     6,     7,     8,     9,    10,    11,    12,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    75,    21,    22,    23,
+      24,    25,    26,    27,    28,    29,    30,    31,    32,    -1,
+      -1,    -1,    36,    37,    38,    39,    -1,    41,    42,    -1,
+      44,     3,     4,     5,     6,     7,     8,     9,    10,    11,
+      12,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    21,
       22,    23,    24,    25,    26,    27,    28,    29,    30,    31,
       32,    -1,    -1,    -1,    36,    37,    38,    39,    -1,    41,
       42,    -1,    44,     4,     5,     6,    -1,    -1,    -1,    10,
       11,    12,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       21,    22,    23,    24,    25,    26,    27,    28,    29,    30,
-      31,    32,    -1,    -1,    -1,    -1,    -1,    38,    39,    -1,
-      41,    42,    43,    44,    -1,    -1,    -1,    48,     3,     4,
-       5,     6,     7,     8,     9,    10,    11,    12,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    21,    22,    23,    24,
-      25,    26,    27,    28,    29,    30,    31,    32,    -1,    -1,
-      -1,    36,    37,    38,    39,    -1,    41,    42,    -1,    44,
-       4,     5,     6,    -1,    -1,    -1,    10,    11,    12,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    21,    22,    23,
-      24,    25,    26,    27,    28,    29,    30,    31,    32,    -1,
-      10,    11,    12,    -1,    38,    39,    -1,    41,    42,    -1,
-      44,    21,    22,    23,    24,    25,    26,    27,    28,    29,
-      30,    31,    32,    -1,    -1,    -1,    -1,    -1,    38,    39,
-      -1,    41,    42,    -1,    44
+      31,    32,    -1,    10,    11,    12,    -1,    38,    39,    -1,
+      41,    42,    -1,    44,    21,    22,    23,    24,    25,    26,
+      27,    28,    29,    30,    31,    32,    -1,    -1,    -1,    -1,
+      -1,    38,    39,    -1,    41,    42,    43,    44,    10,    11,
+      12,    48,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    21,
+      22,    23,    24,    25,    26,    27,    28,    29,    30,    31,
+      32,    -1,    -1,    -1,    -1,    -1,    38,    39,    -1,    41,
+      42,    -1,    44
 };
 
 /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
@@ -1270,9 +1276,9 @@
       47,    48,    51,    52,    70,    81,    82,    84,    95,    96,
       97,    99,   100,   101,   102,   103,   104,   105,   106,   107,
      108,   109,   110,   111,   112,   113,   114,   115,   116,   117,
-     118,   119,   123,   137,    80,   142,    43,   144,   145,    75,
+     118,   119,   123,   140,    80,   142,    43,   144,   145,    75,
      143,    13,    14,    15,    17,    18,    19,    20,    40,    74,
-      75,    80,   106,   119,   120,   122,   124,   125,   137,   147,
+      75,    80,   106,   119,   120,   122,   124,   125,   140,   147,
      148,   149,   150,   155,   156,   157,   160,   167,    43,   129,
      132,    72,    79,    73,   123,   120,   146,   106,   106,   122,
       51,    52,    72,    76,    71,    71,    77,    39,   120,    70,
@@ -2614,13 +2620,6 @@
         //
         // Constructor
         //
-        if ((yyvsp[(1) - (1)].interm.type).array) {
-            // Constructors for arrays are not allowed.
-            context->error((yyvsp[(1) - (1)].interm.type).line, "cannot construct this type", "array", "");
-            context->recover();
-            (yyvsp[(1) - (1)].interm.type).setArray(false);
-        }
-
         TOperator op = EOpNull;
         if ((yyvsp[(1) - (1)].interm.type).userDef) {
             op = EOpConstructStruct;
@@ -3360,13 +3359,6 @@
 
     {
         (yyval.interm) = (yyvsp[(1) - (1)].interm);
-        
-        if ((yyval.interm).type.precision == EbpUndefined) {
-            (yyval.interm).type.precision = context->symbolTable.getDefaultPrecision((yyvsp[(1) - (1)].interm).type.type);
-            if (context->precisionErrorCheck((yyvsp[(1) - (1)].interm).line, (yyval.interm).type.precision, (yyvsp[(1) - (1)].interm).type.type)) {
-                context->recover();
-            }
-        }
     ;}
     break;
 
@@ -3666,6 +3658,13 @@
 
     {
         (yyval.interm.type) = (yyvsp[(1) - (1)].interm.type);
+
+        if ((yyval.interm.type).precision == EbpUndefined) {
+            (yyval.interm.type).precision = context->symbolTable.getDefaultPrecision((yyvsp[(1) - (1)].interm.type).type);
+            if (context->precisionErrorCheck((yyvsp[(1) - (1)].interm.type).line, (yyval.interm.type).precision, (yyvsp[(1) - (1)].interm.type).type)) {
+                context->recover();
+            }
+        }
     ;}
     break;
 
@@ -3970,6 +3969,7 @@
             type->setBasicType((yyvsp[(1) - (3)].interm.type).type);
             type->setNominalSize((yyvsp[(1) - (3)].interm.type).size);
             type->setMatrix((yyvsp[(1) - (3)].interm.type).matrix);
+            type->setPrecision((yyvsp[(1) - (3)].interm.type).precision);
 
             // don't allow arrays of arrays
             if (type->isArray()) {