Add basic error checks for switch and case
Check that the case labels have constant scalar integers, and that switch
statements are initialized with scalar integers. Also check that case and
default labels do not exist outside switch statements. Allow break
statements inside switch statements.
Tested by manually disabling shading language version checks for switch
in a Chromium build and checking that the expected errors are generated.
BUG=angle:921
Change-Id: Ibe83d0db52958c493ded5640d4babf670dc02d55
Reviewed-on: https://chromium-review.googlesource.com/251523
Reviewed-by: Zhenyao Mo <zmo@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Tested-by: Olli Etuaho <oetuaho@nvidia.com>
diff --git a/src/compiler/translator/ParseContext.cpp b/src/compiler/translator/ParseContext.cpp
index f4a29db..0b4e58d 100644
--- a/src/compiler/translator/ParseContext.cpp
+++ b/src/compiler/translator/ParseContext.cpp
@@ -2610,6 +2610,17 @@
TIntermSwitch *TParseContext::addSwitch(TIntermTyped *init, TIntermAggregate *statementList, const TSourceLoc &loc)
{
+ TBasicType switchType = init->getBasicType();
+ if ((switchType != EbtInt && switchType != EbtUInt) ||
+ init->isMatrix() ||
+ init->isArray() ||
+ init->isVector())
+ {
+ error(init->getLine(), "init-expression in a switch statement must be a scalar integer", "switch");
+ recover();
+ return nullptr;
+ }
+
TIntermSwitch *node = intermediate.addSwitch(init, statementList, loc);
if (node == nullptr)
{
@@ -2622,6 +2633,32 @@
TIntermCase *TParseContext::addCase(TIntermTyped *condition, const TSourceLoc &loc)
{
+ if (mSwitchNestingLevel == 0)
+ {
+ error(loc, "case labels need to be inside switch statements", "case");
+ recover();
+ return nullptr;
+ }
+ if (condition == nullptr)
+ {
+ error(loc, "case label must have a condition", "case");
+ recover();
+ return nullptr;
+ }
+ if ((condition->getBasicType() != EbtInt && condition->getBasicType() != EbtUInt) ||
+ condition->isMatrix() ||
+ condition->isArray() ||
+ condition->isVector())
+ {
+ error(condition->getLine(), "case label must be a scalar integer", "case");
+ recover();
+ }
+ TIntermConstantUnion *conditionConst = condition->getAsConstantUnion();
+ if (conditionConst == nullptr)
+ {
+ error(condition->getLine(), "case label must be constant", "case");
+ recover();
+ }
TIntermCase *node = intermediate.addCase(condition, loc);
if (node == nullptr)
{
@@ -2634,6 +2671,12 @@
TIntermCase *TParseContext::addDefault(const TSourceLoc &loc)
{
+ if (mSwitchNestingLevel == 0)
+ {
+ error(loc, "default labels need to be inside switch statements", "default");
+ recover();
+ return nullptr;
+ }
TIntermCase *node = intermediate.addCase(nullptr, loc);
if (node == nullptr)
{
@@ -2703,9 +2746,9 @@
}
break;
case EOpBreak:
- if (mLoopNestingLevel <= 0)
+ if (mLoopNestingLevel <= 0 && mSwitchNestingLevel <= 0)
{
- error(loc, "break statement only allowed in loops", "");
+ error(loc, "break statement only allowed in loops and switch statements", "");
recover();
}
break;
diff --git a/src/compiler/translator/ParseContext.h b/src/compiler/translator/ParseContext.h
index a4e28de..ff0ba37 100644
--- a/src/compiler/translator/ParseContext.h
+++ b/src/compiler/translator/ParseContext.h
@@ -34,6 +34,7 @@
treeRoot(0),
mLoopNestingLevel(0),
structNestingLevel(0),
+ mSwitchNestingLevel(0),
currentFunctionType(NULL),
mFunctionReturnsValue(false),
checksPrecisionErrors(checksPrecErrors),
@@ -53,6 +54,7 @@
TIntermNode* treeRoot; // root of parse tree being created
int mLoopNestingLevel; // 0 if outside all loops
int structNestingLevel; // incremented while parsing a struct declaration
+ int mSwitchNestingLevel; // 0 if outside all switch statements
const TType* currentFunctionType; // the return type of the function that's currently being parsed
bool mFunctionReturnsValue; // 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.
diff --git a/src/compiler/translator/glslang.y b/src/compiler/translator/glslang.y
index 95eaaf6..2b1ab6a 100644
--- a/src/compiler/translator/glslang.y
+++ b/src/compiler/translator/glslang.y
@@ -1606,8 +1606,9 @@
;
switch_statement
- : SWITCH LEFT_PAREN expression RIGHT_PAREN compound_statement {
- $$ = context->addSwitch($3, $5, @1);
+ : SWITCH LEFT_PAREN expression RIGHT_PAREN { ++context->mSwitchNestingLevel; } compound_statement {
+ $$ = context->addSwitch($3, $6, @1);
+ --context->mSwitchNestingLevel;
}
;
diff --git a/src/compiler/translator/glslang_tab.cpp b/src/compiler/translator/glslang_tab.cpp
index 21b3024..8b783f9 100644
--- a/src/compiler/translator/glslang_tab.cpp
+++ b/src/compiler/translator/glslang_tab.cpp
@@ -626,11 +626,11 @@
/* YYNTOKENS -- Number of terminals. */
#define YYNTOKENS 128
/* YYNNTS -- Number of nonterminals. */
-#define YYNNTS 93
+#define YYNNTS 94
/* YYNRULES -- Number of rules. */
-#define YYNRULES 268
+#define YYNRULES 269
/* YYNSTATES -- Number of states. */
-#define YYNSTATES 404
+#define YYNSTATES 405
/* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned
by yylex, with out-of-bounds checking. */
@@ -713,9 +713,9 @@
1501, 1516, 1520, 1524, 1525, 1531, 1532, 1533, 1534, 1535,
1536, 1537, 1541, 1542, 1542, 1542, 1552, 1553, 1557, 1557,
1558, 1558, 1563, 1566, 1576, 1579, 1585, 1586, 1590, 1598,
- 1602, 1609, 1615, 1618, 1625, 1630, 1647, 1647, 1652, 1652,
- 1659, 1659, 1667, 1670, 1676, 1679, 1685, 1689, 1696, 1699,
- 1702, 1705, 1708, 1717, 1721, 1728, 1731, 1737, 1737
+ 1602, 1609, 1609, 1616, 1619, 1626, 1631, 1648, 1648, 1653,
+ 1653, 1660, 1660, 1668, 1671, 1677, 1680, 1686, 1690, 1697,
+ 1700, 1703, 1706, 1709, 1718, 1722, 1729, 1732, 1738, 1738
};
#endif
@@ -775,11 +775,11 @@
"compound_statement", "$@3", "$@4", "statement_no_new_scope",
"statement_with_scope", "$@5", "$@6", "compound_statement_no_new_scope",
"statement_list", "expression_statement", "selection_statement",
- "selection_rest_statement", "switch_statement", "case_label",
- "condition", "iteration_statement", "$@7", "$@8", "$@9",
+ "selection_rest_statement", "switch_statement", "$@7", "case_label",
+ "condition", "iteration_statement", "$@8", "$@9", "$@10",
"for_init_statement", "conditionopt", "for_rest_statement",
"jump_statement", "translation_unit", "external_declaration",
- "function_definition", "$@10", YY_NULLPTR
+ "function_definition", "$@11", YY_NULLPTR
};
#endif
@@ -818,47 +818,47 @@
STATE-NUM. */
static const yytype_int16 yypact[] =
{
- 1946, -28, -334, -334, -334, 179, -334, -334, -334, -334,
+ 1946, -28, -334, -334, -334, 183, -334, -334, -334, -334,
-334, -334, -334, -334, -334, -334, -334, -334, -334, -334,
-334, -334, -334, -334, -334, -334, -334, -334, -334, -334,
-334, -334, -334, -334, -334, -334, -334, 91, -334, -334,
-40, -334, -334, -334, -334, -334, -334, -334, -334, -334,
-334, -334, -334, -334, -334, -334, -334, -334, -334, -90,
- -334, -334, -88, -62, -64, 10, 5, -334, 117, 14,
- 1161, -334, -334, 2231, 14, -334, 18, -334, 1871, -334,
- -334, -334, -334, 2231, -334, -334, -334, -334, -334, -14,
- 27, -334, 33, -334, 55, -334, -334, -334, -334, -334,
- 2095, 147, 127, -334, 73, -34, -334, 87, -334, 2021,
- -334, -334, -334, 1424, -334, -334, 67, 2021, -334, 86,
- -4, -334, 389, -334, -334, -334, -334, 127, 2095, -21,
- -334, 260, 1424, -334, 157, 2095, 127, 1616, -334, 101,
+ -334, -334, -88, -62, -64, 10, 5, -334, 105, 14,
+ 1161, -334, -334, 2231, 14, -334, -12, -334, 1871, -334,
+ -334, -334, -334, 2231, -334, -334, -334, -334, -334, -5,
+ 48, -334, 33, -334, 55, -334, -334, -334, -334, -334,
+ 2095, 150, 108, -334, 73, -34, -334, 93, -334, 2021,
+ -334, -334, -334, 1424, -334, -334, 85, 2021, -334, 92,
+ -4, -334, 389, -334, -334, -334, -334, 108, 2095, -21,
+ -334, 260, 1424, -334, 163, 2095, 108, 1616, -334, 125,
-334, -334, -334, -334, 1424, 1424, 1424, -334, -334, -334,
- -334, -334, -334, 19, -334, -334, -334, 102, -3, 1519,
- 107, -334, 1424, 71, -32, 126, -48, 134, 103, 106,
- 109, 152, 151, -71, -334, 138, -334, -334, 1701, 2021,
- 146, -334, 27, 133, 135, -334, 144, 154, 136, 1231,
- 155, 1424, 139, 156, 153, -334, -334, 119, -334, -334,
+ -334, -334, -334, 19, -334, -334, -334, 104, -3, 1519,
+ 127, -334, 1424, 74, -32, 120, -48, 121, 107, 115,
+ 117, 152, 151, -71, -334, 138, -334, -334, 1701, 2021,
+ 144, -334, 48, 133, 134, -334, 145, 146, 137, 1231,
+ 154, 1424, 143, 155, 147, -334, -334, 119, -334, -334,
29, -334, -88, 17, -334, -334, -334, -334, 505, -334,
- -334, -334, -334, -334, -334, 149, -334, -334, 1326, 1424,
- -334, 158, -334, -334, 127, 150, 60, -334, -56, -334,
+ -334, -334, -334, -334, -334, 156, -334, -334, 1326, 1424,
+ -334, 153, -334, -334, 108, 157, 60, -334, -56, -334,
-334, -334, 1, -334, -334, 1424, 2163, -334, -334, 1424,
- 159, -334, -334, -334, 1424, 1424, 1424, 1424, 1424, 1424,
+ 161, -334, -334, -334, 1424, 1424, 1424, 1424, 1424, 1424,
1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424,
1424, 1424, 1424, 1424, -334, -334, 1786, -334, -334, -334,
- -334, -334, 160, -334, 1424, -334, -334, 61, 1424, 162,
+ -334, -334, 159, -334, 1424, -334, -334, 61, 1424, 149,
-334, -334, -334, 621, -334, -334, -334, -334, -334, -334,
-334, -334, -334, -334, -334, 1424, 1424, -334, -334, -334,
- 1424, -334, 168, -334, -334, 62, 1424, 127, -334, -25,
- -334, -334, 169, 166, 101, 165, -334, -334, -334, -334,
- -334, -334, 71, 71, -32, -32, 126, 126, 126, 126,
- -48, -48, 134, 103, 106, 109, 152, 151, 116, -334,
- 205, 33, 853, 969, 15, -334, 25, -334, 1066, 621,
- -334, -334, 171, -334, -334, 172, -334, 1424, -334, -334,
- 1424, 176, -334, -334, -334, -334, 1066, 160, 173, 166,
- 127, 2095, 177, 175, -334, -334, 193, -334, 1424, -334,
- 187, 197, 287, -334, -334, 198, 737, -334, 199, 28,
- 1424, 737, 160, 1424, -334, -334, -334, -334, 202, 166,
- -334, -334, -334, -334
+ 1424, -334, 162, -334, -334, 62, 1424, 108, -334, -25,
+ -334, -334, 167, 164, 125, 172, -334, -334, -334, -334,
+ -334, -334, 74, 74, -32, -32, 120, 120, 120, 120,
+ -48, -48, 121, 107, 115, 117, 152, 151, 114, -334,
+ 221, 33, 853, 969, 15, -334, 25, -334, 1066, 621,
+ -334, -334, 171, -334, -334, 173, -334, 1424, -334, -334,
+ 1424, 175, -334, -334, -334, -334, 1066, 159, -334, 164,
+ 108, 2095, 176, 191, -334, -334, 177, -334, 1424, -334,
+ 168, 196, 285, -334, 203, 199, 737, -334, 190, 28,
+ 1424, 737, 159, -334, 1424, -334, -334, -334, -334, 202,
+ 164, -334, -334, -334, -334
};
/* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
@@ -872,19 +872,19 @@
128, 174, 175, 176, 177, 178, 179, 0, 125, 124,
0, 154, 180, 182, 195, 196, 183, 184, 185, 186,
187, 188, 189, 190, 191, 181, 192, 193, 194, 0,
- 198, 266, 267, 0, 96, 106, 0, 111, 116, 132,
- 0, 130, 122, 0, 133, 141, 152, 197, 0, 263,
- 265, 129, 121, 0, 138, 139, 2, 3, 201, 0,
+ 198, 267, 268, 0, 96, 106, 0, 111, 116, 132,
+ 0, 130, 122, 0, 133, 141, 152, 197, 0, 264,
+ 266, 129, 121, 0, 138, 139, 2, 3, 201, 0,
0, 87, 0, 94, 106, 126, 107, 108, 109, 97,
0, 106, 0, 88, 2, 117, 131, 0, 93, 0,
- 123, 142, 134, 0, 1, 264, 0, 0, 199, 149,
- 0, 147, 0, 268, 98, 103, 105, 110, 0, 112,
+ 123, 142, 134, 0, 1, 265, 0, 0, 199, 149,
+ 0, 147, 0, 269, 98, 103, 105, 110, 0, 112,
99, 0, 0, 86, 0, 0, 0, 0, 203, 4,
8, 6, 7, 9, 0, 0, 0, 36, 35, 37,
34, 5, 11, 30, 13, 18, 19, 0, 0, 24,
0, 38, 0, 42, 45, 48, 53, 56, 58, 60,
62, 64, 66, 68, 85, 0, 28, 89, 0, 0,
- 0, 146, 0, 0, 0, 248, 0, 0, 0, 0,
+ 0, 146, 0, 0, 0, 249, 0, 0, 0, 0,
0, 0, 0, 0, 223, 232, 236, 38, 70, 83,
0, 212, 0, 152, 215, 234, 214, 213, 0, 216,
217, 218, 219, 220, 221, 100, 102, 104, 0, 0,
@@ -893,35 +893,35 @@
23, 25, 27, 33, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 153, 202, 0, 150, 151, 148,
- 259, 258, 230, 250, 0, 262, 260, 0, 0, 0,
- 243, 246, 222, 0, 73, 74, 76, 75, 78, 79,
+ 260, 259, 230, 251, 0, 263, 261, 0, 0, 0,
+ 244, 247, 222, 0, 73, 74, 76, 75, 78, 79,
80, 81, 82, 77, 72, 0, 0, 237, 233, 235,
0, 113, 0, 115, 119, 0, 0, 0, 205, 0,
90, 10, 0, 17, 2, 3, 14, 20, 26, 39,
40, 41, 44, 43, 46, 47, 51, 52, 49, 50,
54, 55, 57, 59, 61, 63, 65, 67, 0, 200,
- 0, 0, 0, 0, 0, 261, 0, 242, 0, 224,
+ 0, 0, 0, 0, 0, 262, 0, 243, 0, 224,
71, 84, 0, 114, 206, 0, 208, 0, 91, 12,
- 0, 0, 229, 231, 253, 252, 255, 230, 0, 244,
- 0, 0, 0, 0, 101, 210, 0, 69, 0, 254,
- 0, 0, 240, 238, 241, 0, 0, 225, 0, 0,
- 256, 0, 230, 0, 227, 247, 226, 92, 0, 257,
- 251, 239, 245, 249
+ 0, 0, 229, 231, 254, 253, 256, 230, 241, 245,
+ 0, 0, 0, 0, 101, 210, 0, 69, 0, 255,
+ 0, 0, 240, 238, 0, 0, 0, 225, 0, 0,
+ 257, 0, 230, 242, 0, 227, 248, 226, 92, 0,
+ 258, 252, 239, 246, 250
};
/* YYPGOTO[NTERM-NUM]. */
static const yytype_int16 yypgoto[] =
{
- -334, -39, -334, -334, -334, -334, -334, -334, 76, -334,
- -334, -334, -334, -100, -334, -12, -11, -86, -15, 78,
- 89, 85, 90, 92, 93, -334, -104, -126, -334, -136,
- -120, -334, 4, 12, -334, -334, -334, 223, 258, 253,
+ -334, -39, -334, -334, -334, -334, -334, -334, 77, -334,
+ -334, -334, -334, -100, -334, -20, -14, -86, -17, 78,
+ 86, 88, 90, 94, 89, -334, -104, -126, -334, -136,
+ -120, -334, 4, 12, -334, -334, -334, 224, 259, 253,
228, -334, -334, -324, -334, -334, -102, -44, -68, 352,
-334, -334, 178, -45, 0, -334, -334, -334, -99, -132,
- 137, 51, -211, 16, -186, -325, -6, -334, -334, -26,
+ 135, 51, -211, 18, -186, -325, -22, -334, -334, -26,
-333, -334, -334, -89, 80, 26, -334, -334, -334, -334,
- 2, -334, -334, -334, -334, -334, -334, -334, -334, -334,
- 292, -334, -334
+ -334, 2, -334, -334, -334, -334, -334, -334, -334, -334,
+ -334, 292, -334, -334
};
/* YYDEFGOTO[NTERM-NUM]. */
@@ -933,10 +933,10 @@
175, 109, 201, 202, 63, 64, 65, 125, 99, 100,
126, 66, 67, 68, 69, 101, 70, 71, 72, 73,
74, 120, 121, 75, 176, 77, 179, 117, 137, 138,
- 226, 227, 223, 204, 205, 206, 207, 283, 373, 395,
- 340, 341, 342, 396, 208, 209, 210, 383, 211, 212,
- 372, 213, 348, 272, 343, 366, 380, 381, 214, 78,
- 79, 80, 92
+ 226, 227, 223, 204, 205, 206, 207, 283, 373, 396,
+ 340, 341, 342, 397, 208, 209, 210, 383, 211, 384,
+ 212, 372, 213, 348, 272, 343, 366, 380, 381, 214,
+ 78, 79, 80, 92
};
/* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If
@@ -949,38 +949,38 @@
309, 262, 299, 7, 370, 106, 91, 174, 111, 105,
112, 161, 127, 241, 382, 135, 86, 87, 116, 251,
252, 136, 370, 93, 230, 231, 229, 94, 82, 136,
- 96, 97, 98, 277, 27, 28, 263, 29, 310, 401,
- 127, 394, 243, 129, 95, 37, 394, 224, 88, 136,
+ 96, 97, 98, 277, 27, 28, 263, 29, 310, 402,
+ 127, 395, 243, 129, 95, 37, 395, 224, 88, 136,
76, 279, 131, 76, 253, 254, 135, 135, 76, 132,
266, 357, 61, 76, 247, 218, 248, 174, 215, 358,
- 62, 161, 219, 222, 118, 96, 97, 98, 302, 313,
- 76, 181, 238, 119, 233, 234, 311, 182, 239, 76,
+ 62, 161, 219, 222, 113, 96, 97, 98, 302, 313,
+ 76, 181, 238, 118, 233, 234, 311, 182, 239, 76,
136, 136, 296, 318, 174, -95, 102, 76, 161, 103,
- 367, -28, 203, 113, 113, 235, 296, 338, 76, 236,
- 368, 84, 85, 398, 229, 76, 296, 76, 344, 296,
+ 367, -28, 203, 113, 119, 235, 296, 338, 76, 236,
+ 368, 84, 85, 399, 229, 76, 296, 76, 344, 296,
296, 122, 346, 297, 319, 320, 321, 161, 161, 161,
161, 161, 161, 161, 161, 161, 161, 161, 161, 161,
161, 161, 161, 299, 135, 326, 327, 328, 329, 350,
351, 307, 296, 307, 308, 345, 354, 130, 76, 76,
- 352, 177, 402, 2, 3, 4, 355, 96, 97, 98,
- 244, 245, 246, 104, 87, 133, 174, 316, 136, 180,
- 161, 81, 174, 86, 87, -29, 161, 237, 203, 249,
- 250, 242, 369, 284, 285, 286, 287, 288, 289, 290,
- 291, 292, 293, 255, 256, 267, 268, 296, 360, 257,
- 369, 258, 294, 259, 377, 322, 323, 376, 324, 325,
- 330, 331, 389, 260, 261, 264, 371, 270, 273, 271,
- 275, 280, 362, 174, 399, 300, 306, 161, 274, 278,
- 281, 361, 282, -154, 371, 304, 76, 222, -228, -198,
- 8, 9, 10, 11, 347, 353, 359, 296, 374, 375,
- 378, 194, 386, 203, 387, 12, 13, 14, 15, 16,
+ 352, 104, 87, 403, 86, 87, 355, 2, 3, 4,
+ 96, 97, 98, 244, 245, 246, 174, 316, 136, 177,
+ 161, 133, 174, 249, 250, 180, 161, 81, 203, 237,
+ 255, 256, 369, 284, 285, 286, 287, 288, 289, 290,
+ 291, 292, 293, 267, 268, 296, 360, 322, 323, -29,
+ 369, 242, 294, 257, 377, 324, 325, 376, 330, 331,
+ 258, 259, 389, 260, 261, 264, 371, 270, 271, 273,
+ 274, 275, 362, 174, 400, 280, 282, 161, 278, 281,
+ 304, 347, 300, 306, 371, -154, 76, -228, 222, 353,
+ 8, 9, 10, 11, 359, 296, -198, 361, 374, 378,
+ 375, 386, 390, 203, 388, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
- 388, 390, 391, 110, 392, 31, 32, 33, 34, 35,
- 36, 393, 317, 397, 40, 41, 403, 42, 43, 44,
+ 387, 391, 392, 110, 398, 31, 32, 33, 34, 35,
+ 36, 194, 394, 317, 40, 41, 404, 42, 43, 44,
45, 46, 47, 48, 49, 50, 51, 52, 53, 54,
55, 385, 56, 57, 58, 332, 139, 60, 140, 141,
- 142, 143, 203, 203, 334, 144, 145, 333, 203, 203,
- 335, 216, 124, 336, 128, 337, 217, 83, 356, 364,
- 269, 305, 384, 349, 146, 400, 203, 220, 379, 365,
+ 142, 143, 203, 203, 333, 144, 145, 334, 203, 203,
+ 335, 337, 216, 124, 128, 336, 217, 83, 356, 305,
+ 269, 364, 393, 349, 146, 401, 203, 220, 379, 365,
115, 76, 0, 0, 0, 147, 148, 149, 150, 0,
0, 0, 0, 0, 0, 0, 203, 0, 0, 0,
0, 203, 1, 2, 3, 4, 5, 6, 7, 8,
@@ -1188,34 +1188,34 @@
128, 386, 162, 102, 9, 51, 391, 135, 108, 137,
70, 191, 106, 73, 122, 123, 178, 179, 78, 113,
179, 106, 78, 83, 116, 106, 118, 191, 127, 114,
- 78, 191, 113, 219, 108, 40, 41, 42, 218, 235,
- 100, 105, 105, 76, 85, 86, 105, 111, 111, 109,
+ 78, 191, 113, 219, 106, 40, 41, 42, 218, 235,
+ 100, 105, 105, 108, 85, 86, 105, 111, 111, 109,
178, 179, 111, 239, 218, 105, 111, 117, 218, 114,
- 105, 104, 122, 106, 106, 106, 111, 263, 128, 110,
+ 105, 104, 122, 106, 76, 106, 111, 263, 128, 110,
105, 40, 41, 105, 266, 135, 111, 137, 274, 111,
111, 108, 278, 114, 244, 245, 246, 247, 248, 249,
250, 251, 252, 253, 254, 255, 256, 257, 258, 259,
260, 261, 262, 349, 266, 251, 252, 253, 254, 295,
296, 111, 111, 111, 114, 114, 114, 104, 178, 179,
- 300, 114, 393, 4, 5, 6, 306, 40, 41, 42,
- 119, 120, 121, 76, 77, 108, 300, 236, 266, 113,
- 300, 44, 306, 76, 77, 104, 306, 105, 208, 83,
- 84, 104, 348, 94, 95, 96, 97, 98, 99, 100,
- 101, 102, 103, 89, 90, 79, 80, 111, 112, 126,
- 366, 125, 113, 124, 360, 247, 248, 357, 249, 250,
- 255, 256, 378, 91, 93, 107, 348, 114, 104, 114,
- 114, 112, 341, 357, 390, 106, 106, 357, 104, 104,
- 104, 56, 109, 104, 366, 107, 266, 393, 108, 104,
- 10, 11, 12, 13, 112, 107, 107, 111, 107, 107,
- 104, 108, 105, 283, 109, 25, 26, 27, 28, 29,
+ 300, 76, 77, 394, 76, 77, 306, 4, 5, 6,
+ 40, 41, 42, 119, 120, 121, 300, 236, 266, 114,
+ 300, 108, 306, 83, 84, 113, 306, 44, 208, 105,
+ 89, 90, 348, 94, 95, 96, 97, 98, 99, 100,
+ 101, 102, 103, 79, 80, 111, 112, 247, 248, 104,
+ 366, 104, 113, 126, 360, 249, 250, 357, 255, 256,
+ 125, 124, 378, 91, 93, 107, 348, 114, 114, 104,
+ 104, 114, 341, 357, 390, 112, 109, 357, 104, 104,
+ 107, 112, 106, 106, 366, 104, 266, 108, 394, 107,
+ 10, 11, 12, 13, 107, 111, 104, 56, 107, 104,
+ 107, 105, 114, 283, 107, 25, 26, 27, 28, 29,
30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
- 107, 114, 105, 371, 17, 45, 46, 47, 48, 49,
- 50, 113, 236, 114, 54, 55, 114, 57, 58, 59,
+ 109, 105, 17, 371, 114, 45, 46, 47, 48, 49,
+ 50, 108, 113, 236, 54, 55, 114, 57, 58, 59,
60, 61, 62, 63, 64, 65, 66, 67, 68, 69,
70, 370, 72, 73, 74, 257, 76, 77, 78, 79,
- 80, 81, 342, 343, 259, 85, 86, 258, 348, 349,
- 260, 128, 94, 261, 101, 262, 128, 5, 307, 343,
- 182, 224, 368, 283, 104, 391, 366, 107, 366, 343,
+ 80, 81, 342, 343, 258, 85, 86, 259, 348, 349,
+ 260, 262, 128, 94, 101, 261, 128, 5, 307, 224,
+ 182, 343, 384, 283, 104, 391, 366, 107, 366, 343,
78, 371, -1, -1, -1, 115, 116, 117, 118, -1,
-1, -1, -1, -1, -1, -1, 386, -1, -1, -1,
-1, 391, 3, 4, 5, 6, 7, 8, 9, 10,
@@ -1423,11 +1423,11 @@
54, 55, 57, 58, 59, 60, 61, 62, 63, 64,
65, 66, 67, 68, 69, 70, 72, 73, 74, 75,
77, 160, 161, 162, 163, 164, 169, 170, 171, 172,
- 174, 175, 176, 177, 178, 181, 182, 183, 217, 218,
- 219, 44, 76, 177, 40, 41, 76, 77, 108, 129,
- 104, 114, 220, 105, 111, 9, 40, 41, 42, 166,
+ 174, 175, 176, 177, 178, 181, 182, 183, 218, 219,
+ 220, 44, 76, 177, 40, 41, 76, 77, 108, 129,
+ 104, 114, 221, 105, 111, 9, 40, 41, 42, 166,
167, 173, 111, 114, 76, 129, 175, 76, 114, 159,
- 176, 181, 175, 106, 0, 218, 181, 185, 108, 76,
+ 176, 181, 175, 106, 0, 219, 181, 185, 108, 76,
179, 180, 108, 201, 166, 165, 168, 176, 167, 129,
104, 106, 113, 108, 3, 174, 176, 186, 187, 76,
78, 79, 80, 81, 85, 86, 104, 115, 116, 117,
@@ -1437,26 +1437,26 @@
113, 105, 111, 14, 15, 16, 18, 19, 20, 21,
22, 23, 24, 56, 108, 109, 114, 141, 154, 155,
157, 160, 161, 182, 191, 192, 193, 194, 202, 203,
- 204, 206, 207, 209, 216, 129, 165, 168, 106, 113,
+ 204, 206, 208, 210, 217, 129, 165, 168, 106, 113,
107, 158, 155, 190, 176, 129, 188, 189, 109, 187,
141, 141, 157, 85, 86, 106, 110, 105, 105, 111,
55, 155, 104, 141, 119, 120, 121, 116, 118, 83,
84, 87, 88, 122, 123, 89, 90, 126, 125, 124,
91, 93, 92, 127, 107, 109, 186, 79, 80, 180,
- 114, 114, 211, 104, 104, 114, 114, 157, 104, 158,
+ 114, 114, 212, 104, 104, 114, 114, 157, 104, 158,
112, 104, 109, 195, 94, 95, 96, 97, 98, 99,
100, 101, 102, 103, 113, 156, 111, 114, 109, 192,
106, 107, 158, 190, 107, 188, 106, 111, 114, 76,
114, 105, 133, 157, 76, 77, 129, 136, 155, 141,
141, 141, 143, 143, 144, 144, 145, 145, 145, 145,
146, 146, 147, 148, 149, 150, 151, 152, 157, 109,
- 198, 199, 200, 212, 157, 114, 157, 112, 210, 202,
+ 198, 199, 200, 213, 157, 114, 157, 112, 211, 202,
155, 155, 158, 107, 114, 158, 189, 106, 114, 107,
- 112, 56, 201, 193, 191, 203, 213, 105, 105, 157,
- 171, 174, 208, 196, 107, 107, 158, 155, 104, 208,
- 214, 215, 198, 205, 194, 129, 105, 109, 107, 157,
- 114, 105, 17, 113, 193, 197, 201, 114, 105, 157,
- 197, 198, 190, 114
+ 112, 56, 201, 193, 191, 203, 214, 105, 105, 157,
+ 171, 174, 209, 196, 107, 107, 158, 155, 104, 209,
+ 215, 216, 198, 205, 207, 129, 105, 109, 107, 157,
+ 114, 105, 17, 194, 113, 193, 197, 201, 114, 105,
+ 157, 197, 198, 190, 114
};
/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
@@ -1486,9 +1486,9 @@
189, 190, 191, 192, 192, 193, 193, 193, 193, 193,
193, 193, 194, 195, 196, 194, 197, 197, 199, 198,
200, 198, 201, 201, 202, 202, 203, 203, 204, 205,
- 205, 206, 207, 207, 208, 208, 210, 209, 211, 209,
- 212, 209, 213, 213, 214, 214, 215, 215, 216, 216,
- 216, 216, 216, 217, 217, 218, 218, 220, 219
+ 205, 207, 206, 208, 208, 209, 209, 211, 210, 212,
+ 210, 213, 210, 214, 214, 215, 215, 216, 216, 217,
+ 217, 217, 217, 217, 218, 218, 219, 219, 221, 220
};
/* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */
@@ -1518,9 +1518,9 @@
4, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 2, 0, 0, 5, 1, 1, 0, 2,
0, 2, 2, 3, 1, 2, 1, 2, 5, 3,
- 1, 5, 3, 2, 1, 4, 0, 6, 0, 8,
- 0, 7, 1, 1, 1, 0, 2, 3, 2, 2,
- 2, 3, 2, 1, 2, 1, 1, 0, 3
+ 1, 0, 6, 3, 2, 1, 4, 0, 6, 0,
+ 8, 0, 7, 1, 1, 1, 0, 2, 3, 2,
+ 2, 2, 3, 2, 1, 2, 1, 1, 0, 3
};
@@ -4658,16 +4658,15 @@
case 241:
- {
- (yyval.interm.intermSwitch) = context->addSwitch((yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermAggregate), (yylsp[-4]));
- }
+ { ++context->mSwitchNestingLevel; }
break;
case 242:
{
- (yyval.interm.intermCase) = context->addCase((yyvsp[-1].interm.intermTypedNode), (yylsp[-2]));
+ (yyval.interm.intermSwitch) = context->addSwitch((yyvsp[-3].interm.intermTypedNode), (yyvsp[0].interm.intermAggregate), (yylsp[-5]));
+ --context->mSwitchNestingLevel;
}
break;
@@ -4675,7 +4674,7 @@
case 243:
{
- (yyval.interm.intermCase) = context->addDefault((yylsp[-1]));
+ (yyval.interm.intermCase) = context->addCase((yyvsp[-1].interm.intermTypedNode), (yylsp[-2]));
}
break;
@@ -4683,6 +4682,14 @@
case 244:
{
+ (yyval.interm.intermCase) = context->addDefault((yylsp[-1]));
+ }
+
+ break;
+
+ case 245:
+
+ {
(yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
if (context->boolErrorCheck((yyvsp[0].interm.intermTypedNode)->getLine(), (yyvsp[0].interm.intermTypedNode)))
context->recover();
@@ -4690,7 +4697,7 @@
break;
- case 245:
+ case 246:
{
TIntermNode* intermNode;
@@ -4709,13 +4716,13 @@
break;
- case 246:
+ case 247:
{ context->symbolTable.push(); ++context->mLoopNestingLevel; }
break;
- case 247:
+ case 248:
{
context->symbolTable.pop();
@@ -4725,13 +4732,13 @@
break;
- case 248:
+ case 249:
{ ++context->mLoopNestingLevel; }
break;
- case 249:
+ case 250:
{
if (context->boolErrorCheck((yylsp[0]), (yyvsp[-2].interm.intermTypedNode)))
@@ -4743,26 +4750,18 @@
break;
- case 250:
-
- { context->symbolTable.push(); ++context->mLoopNestingLevel; }
-
- break;
-
case 251:
- {
- context->symbolTable.pop();
- (yyval.interm.intermNode) = context->intermediate.addLoop(ELoopFor, (yyvsp[-3].interm.intermNode), reinterpret_cast<TIntermTyped*>((yyvsp[-2].interm.nodePair).node1), reinterpret_cast<TIntermTyped*>((yyvsp[-2].interm.nodePair).node2), (yyvsp[0].interm.intermNode), (yylsp[-6]));
- --context->mLoopNestingLevel;
- }
+ { context->symbolTable.push(); ++context->mLoopNestingLevel; }
break;
case 252:
{
- (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
+ context->symbolTable.pop();
+ (yyval.interm.intermNode) = context->intermediate.addLoop(ELoopFor, (yyvsp[-3].interm.intermNode), reinterpret_cast<TIntermTyped*>((yyvsp[-2].interm.nodePair).node1), reinterpret_cast<TIntermTyped*>((yyvsp[-2].interm.nodePair).node2), (yyvsp[0].interm.intermNode), (yylsp[-6]));
+ --context->mLoopNestingLevel;
}
break;
@@ -4778,7 +4777,7 @@
case 254:
{
- (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
+ (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
}
break;
@@ -4786,7 +4785,7 @@
case 255:
{
- (yyval.interm.intermTypedNode) = 0;
+ (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
}
break;
@@ -4794,13 +4793,21 @@
case 256:
{
+ (yyval.interm.intermTypedNode) = 0;
+ }
+
+ break;
+
+ case 257:
+
+ {
(yyval.interm.nodePair).node1 = (yyvsp[-1].interm.intermTypedNode);
(yyval.interm.nodePair).node2 = 0;
}
break;
- case 257:
+ case 258:
{
(yyval.interm.nodePair).node1 = (yyvsp[-2].interm.intermTypedNode);
@@ -4809,7 +4816,7 @@
break;
- case 258:
+ case 259:
{
(yyval.interm.intermNode) = context->addBranch(EOpContinue, (yylsp[-1]));
@@ -4817,7 +4824,7 @@
break;
- case 259:
+ case 260:
{
(yyval.interm.intermNode) = context->addBranch(EOpBreak, (yylsp[-1]));
@@ -4825,7 +4832,7 @@
break;
- case 260:
+ case 261:
{
(yyval.interm.intermNode) = context->addBranch(EOpReturn, (yylsp[-1]));
@@ -4833,7 +4840,7 @@
break;
- case 261:
+ case 262:
{
(yyval.interm.intermNode) = context->addBranch(EOpReturn, (yyvsp[-1].interm.intermTypedNode), (yylsp[-2]));
@@ -4841,7 +4848,7 @@
break;
- case 262:
+ case 263:
{
FRAG_ONLY("discard", (yylsp[-1]));
@@ -4850,19 +4857,10 @@
break;
- case 263:
-
- {
- (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
- context->treeRoot = (yyval.interm.intermNode);
- }
-
- break;
-
case 264:
{
- (yyval.interm.intermNode) = context->intermediate.growAggregate((yyvsp[-1].interm.intermNode), (yyvsp[0].interm.intermNode), (yyloc));
+ (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
context->treeRoot = (yyval.interm.intermNode);
}
@@ -4871,7 +4869,8 @@
case 265:
{
- (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
+ (yyval.interm.intermNode) = context->intermediate.growAggregate((yyvsp[-1].interm.intermNode), (yyvsp[0].interm.intermNode), (yyloc));
+ context->treeRoot = (yyval.interm.intermNode);
}
break;
@@ -4887,6 +4886,14 @@
case 267:
{
+ (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
+ }
+
+ break;
+
+ case 268:
+
+ {
TFunction* function = (yyvsp[0].interm).function;
const TSymbol *builtIn = context->symbolTable.findBuiltIn(function->getMangledName(), context->shaderVersion);
@@ -4974,7 +4981,7 @@
break;
- case 268:
+ case 269:
{
//?? Check that all paths return a value if return type != void ?