Detect when declaring previously undeclared variables as invariant, and avoid using an uninitialized type.

TRAC #20042
ISSUE=241
Signed-off-by: Daniel Koch
Author: Nicolas Capens

git-svn-id: https://angleproject.googlecode.com/svn/trunk@1002 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/compiler/glslang_tab.cpp b/src/compiler/glslang_tab.cpp
index 056e9a4..4ac10aa 100644
--- a/src/compiler/glslang_tab.cpp
+++ b/src/compiler/glslang_tab.cpp
@@ -666,18 +666,18 @@
      898,   915,   916,   929,   930,   931,   932,   933,   937,   940,
      951,   959,   984,   989,   996,  1032,  1035,  1042,  1050,  1071,
     1090,  1101,  1130,  1135,  1145,  1150,  1160,  1163,  1166,  1169,
-    1175,  1182,  1185,  1201,  1219,  1243,  1266,  1270,  1288,  1296,
-    1328,  1348,  1424,  1433,  1456,  1459,  1465,  1473,  1481,  1489,
-    1499,  1506,  1509,  1512,  1518,  1521,  1536,  1540,  1544,  1548,
-    1557,  1562,  1567,  1572,  1577,  1582,  1587,  1592,  1597,  1602,
-    1608,  1614,  1620,  1625,  1630,  1639,  1648,  1653,  1666,  1666,
-    1680,  1680,  1689,  1692,  1707,  1743,  1747,  1753,  1761,  1777,
-    1781,  1785,  1786,  1792,  1793,  1794,  1795,  1796,  1800,  1801,
-    1801,  1801,  1811,  1812,  1816,  1816,  1817,  1817,  1822,  1825,
-    1835,  1838,  1844,  1845,  1849,  1857,  1861,  1871,  1876,  1893,
-    1893,  1898,  1898,  1905,  1905,  1913,  1916,  1922,  1925,  1931,
-    1935,  1942,  1949,  1956,  1963,  1974,  1983,  1987,  1994,  1997,
-    2003,  2003
+    1175,  1182,  1185,  1207,  1225,  1249,  1272,  1276,  1294,  1302,
+    1334,  1354,  1443,  1452,  1475,  1478,  1484,  1492,  1500,  1508,
+    1518,  1525,  1528,  1531,  1537,  1540,  1555,  1559,  1563,  1567,
+    1576,  1581,  1586,  1591,  1596,  1601,  1606,  1611,  1616,  1621,
+    1627,  1633,  1639,  1644,  1649,  1658,  1667,  1672,  1685,  1685,
+    1699,  1699,  1708,  1711,  1726,  1762,  1766,  1772,  1780,  1796,
+    1800,  1804,  1805,  1811,  1812,  1813,  1814,  1815,  1819,  1820,
+    1820,  1820,  1830,  1831,  1835,  1835,  1836,  1836,  1841,  1844,
+    1854,  1857,  1863,  1864,  1868,  1876,  1880,  1890,  1895,  1912,
+    1912,  1917,  1917,  1924,  1924,  1932,  1935,  1941,  1944,  1950,
+    1954,  1961,  1968,  1975,  1982,  1993,  2002,  2006,  2013,  2016,
+    2022,  2022
 };
 #endif
 
@@ -3316,6 +3316,12 @@
   case 92:
 
     {
+        if ((yyvsp[(1) - (3)].interm).type.type == EbtInvariant && !(yyvsp[(3) - (3)].lex).symbol)
+        {
+            context->error((yyvsp[(3) - (3)].lex).line, "undeclared identifier declared as invariant", (yyvsp[(3) - (3)].lex).string->c_str(), "");
+            context->recover();
+        }
+
         TIntermSymbol* symbol = context->intermediate.addSymbol(0, *(yyvsp[(3) - (3)].lex).string, TType((yyvsp[(1) - (3)].interm).type), (yyvsp[(3) - (3)].lex).line);
         (yyval.interm).intermAggregate = context->intermediate.growAggregate((yyvsp[(1) - (3)].interm).intermNode, symbol, (yyvsp[(3) - (3)].lex).line);
         
@@ -3513,8 +3519,21 @@
 
     {
         VERTEX_ONLY("invariant declaration", (yyvsp[(1) - (2)].lex).line);
-        (yyval.interm).qualifier = EvqInvariantVaryingOut;
-        (yyval.interm).intermAggregate = 0;
+        if (context->globalErrorCheck((yyvsp[(1) - (2)].lex).line, context->symbolTable.atGlobalLevel(), "invariant varying"))
+            context->recover();
+        (yyval.interm).type.setBasic(EbtInvariant, EvqInvariantVaryingOut, (yyvsp[(2) - (2)].lex).line);
+        if (!(yyvsp[(2) - (2)].lex).symbol)
+        {
+            context->error((yyvsp[(2) - (2)].lex).line, "undeclared identifier declared as invariant", (yyvsp[(2) - (2)].lex).string->c_str(), "");
+            context->recover();
+            
+            (yyval.interm).intermAggregate = 0;
+        }
+        else
+        {
+            TIntermSymbol *symbol = context->intermediate.addSymbol(0, *(yyvsp[(2) - (2)].lex).string, TType((yyval.interm).type), (yyvsp[(2) - (2)].lex).line);
+            (yyval.interm).intermAggregate = context->intermediate.makeAggregate(symbol, (yyvsp[(2) - (2)].lex).line);
+        }
     }
     break;