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>
This commit is contained in:
Olli Etuaho 2015-02-20 10:55:14 +02:00
Родитель a3a3666464
Коммит 53f076fac8
4 изменённых файлов: 221 добавлений и 168 удалений

Просмотреть файл

@ -2610,6 +2610,17 @@ TPublicType TParseContext::addStructure(const TSourceLoc& structLine, const TSou
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 @@ TIntermSwitch *TParseContext::addSwitch(TIntermTyped *init, TIntermAggregate *st
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::addCase(TIntermTyped *condition, const TSourceLoc &l
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 @@ TIntermBranch *TParseContext::addBranch(TOperator op, const TSourceLoc &loc)
}
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;

Просмотреть файл

@ -34,6 +34,7 @@ struct TParseContext {
treeRoot(0),
mLoopNestingLevel(0),
structNestingLevel(0),
mSwitchNestingLevel(0),
currentFunctionType(NULL),
mFunctionReturnsValue(false),
checksPrecisionErrors(checksPrecErrors),
@ -53,6 +54,7 @@ struct TParseContext {
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.

Просмотреть файл

@ -1606,8 +1606,9 @@ selection_rest_statement
;
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;
}
;

Просмотреть файл

@ -626,11 +626,11 @@ union yyalloc
/* 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 @@ static const yytype_uint16 yyrline[] =
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 @@ static const char *const yytname[] =
"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 @@ static const yytype_uint16 yytoknum[] =
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 @@ static const yytype_uint16 yydefact[] =
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 @@ static const yytype_uint16 yydefact[] =
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 @@ static const yytype_int16 yydefgoto[] =
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 @@ static const yytype_int16 yytable[] =
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 @@ static const yytype_int16 yycheck[] =
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 @@ static const yytype_uint8 yystos[] =
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 @@ static const yytype_uint8 yystos[] =
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 @@ static const yytype_uint8 yyr1[] =
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 @@ static const yytype_uint8 yyr2[] =
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 @@ yyreduce:
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,13 +4674,21 @@ yyreduce:
case 243:
{
(yyval.interm.intermCase) = context->addDefault((yylsp[-1]));
(yyval.interm.intermCase) = context->addCase((yyvsp[-1].interm.intermTypedNode), (yylsp[-2]));
}
break;
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)))
@ -4690,7 +4697,7 @@ yyreduce:
break;
case 245:
case 246:
{
TIntermNode* intermNode;
@ -4709,13 +4716,13 @@ yyreduce:
break;
case 246:
case 247:
{ context->symbolTable.push(); ++context->mLoopNestingLevel; }
break;
case 247:
case 248:
{
context->symbolTable.pop();
@ -4725,13 +4732,13 @@ yyreduce:
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 @@ yyreduce:
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 @@ yyreduce:
case 254:
{
(yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
(yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
}
break;
@ -4786,13 +4785,21 @@ yyreduce:
case 255:
{
(yyval.interm.intermTypedNode) = 0;
(yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
}
break;
case 256:
{
(yyval.interm.intermTypedNode) = 0;
}
break;
case 257:
{
(yyval.interm.nodePair).node1 = (yyvsp[-1].interm.intermTypedNode);
(yyval.interm.nodePair).node2 = 0;
@ -4800,7 +4807,7 @@ yyreduce:
break;
case 257:
case 258:
{
(yyval.interm.nodePair).node1 = (yyvsp[-2].interm.intermTypedNode);
@ -4809,7 +4816,7 @@ yyreduce:
break;
case 258:
case 259:
{
(yyval.interm.intermNode) = context->addBranch(EOpContinue, (yylsp[-1]));
@ -4817,7 +4824,7 @@ yyreduce:
break;
case 259:
case 260:
{
(yyval.interm.intermNode) = context->addBranch(EOpBreak, (yylsp[-1]));
@ -4825,7 +4832,7 @@ yyreduce:
break;
case 260:
case 261:
{
(yyval.interm.intermNode) = context->addBranch(EOpReturn, (yylsp[-1]));
@ -4833,7 +4840,7 @@ yyreduce:
break;
case 261:
case 262:
{
(yyval.interm.intermNode) = context->addBranch(EOpReturn, (yyvsp[-1].interm.intermTypedNode), (yylsp[-2]));
@ -4841,7 +4848,7 @@ yyreduce:
break;
case 262:
case 263:
{
FRAG_ONLY("discard", (yylsp[-1]));
@ -4850,19 +4857,10 @@ yyreduce:
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 @@ yyreduce:
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;
@ -4886,6 +4885,14 @@ yyreduce:
case 267:
{
(yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
}
break;
case 268:
{
TFunction* function = (yyvsp[0].interm).function;
@ -4974,7 +4981,7 @@ yyreduce:
break;
case 268:
case 269:
{
//?? Check that all paths return a value if return type != void ?