Make switch statements have their own nested scope (bug 11904).
git-svn-id: https://cvs.khronos.org/svn/repos/ogl/trunk/ecosystem/public/sdk/tools/glslang@25949 e7fa87d3-cd2b-0410-9028-fcbf551c1848
This commit is contained in:
parent
c63759ef01
commit
71e01cbab9
Binary file not shown.
@ -14,7 +14,10 @@ ERROR: 0:108: 'case' : cannot be nested inside control flow
|
|||||||
ERROR: 0:115: 'default' : cannot be nested inside control flow
|
ERROR: 0:115: 'default' : cannot be nested inside control flow
|
||||||
ERROR: 0:119: 'case' : cannot appear outside switch statement
|
ERROR: 0:119: 'case' : cannot appear outside switch statement
|
||||||
ERROR: 0:120: 'default' : cannot appear outside switch statement
|
ERROR: 0:120: 'default' : cannot appear outside switch statement
|
||||||
ERROR: 15 compilation errors. No code generated.
|
ERROR: 0:126: 'onlyInSwitch' : undeclared identifier
|
||||||
|
ERROR: 0:128: 'switch' : last case/default label must be followed by statements
|
||||||
|
ERROR: 0:140: 'nestedX' : undeclared identifier
|
||||||
|
ERROR: 18 compilation errors. No code generated.
|
||||||
|
|
||||||
|
|
||||||
ERROR: node is still EOpNull!
|
ERROR: node is still EOpNull!
|
||||||
@ -267,6 +270,64 @@ ERROR: node is still EOpNull!
|
|||||||
0:114 0.000000
|
0:114 0.000000
|
||||||
0:114 true case is null
|
0:114 true case is null
|
||||||
0:116 Branch: Break
|
0:116 Branch: Break
|
||||||
|
0:122 switch
|
||||||
|
0:122 condition
|
||||||
|
0:122 Constant:
|
||||||
|
0:122 0 (const int)
|
||||||
|
0:122 body
|
||||||
|
0:122 Sequence
|
||||||
|
0:123 default:
|
||||||
|
0:? Sequence
|
||||||
|
0:124 Sequence
|
||||||
|
0:124 move second child to first child (mediump int)
|
||||||
|
0:124 'onlyInSwitch' (mediump int)
|
||||||
|
0:124 Constant:
|
||||||
|
0:124 0 (const int)
|
||||||
|
0:126 'onlyInSwitch' (float)
|
||||||
|
0:128 Constant:
|
||||||
|
0:128 0 (const int)
|
||||||
|
0:133 switch
|
||||||
|
0:133 condition
|
||||||
|
0:133 'c' (uniform mediump int)
|
||||||
|
0:133 body
|
||||||
|
0:133 Sequence
|
||||||
|
0:134 case: with expression
|
||||||
|
0:134 Constant:
|
||||||
|
0:134 1 (const int)
|
||||||
|
0:? Sequence
|
||||||
|
0:? Sequence
|
||||||
|
0:137 Branch: Break
|
||||||
|
0:139 case: with expression
|
||||||
|
0:139 Constant:
|
||||||
|
0:139 2 (const int)
|
||||||
|
0:? Sequence
|
||||||
|
0:140 'nestedX' (float)
|
||||||
|
0:141 Branch: Break
|
||||||
|
0:142 case: with expression
|
||||||
|
0:142 Constant:
|
||||||
|
0:142 3 (const int)
|
||||||
|
0:? Sequence
|
||||||
|
0:144 Branch: Break
|
||||||
|
0:145 case: with expression
|
||||||
|
0:145 Constant:
|
||||||
|
0:145 4 (const int)
|
||||||
|
0:? Sequence
|
||||||
|
0:146 Sequence
|
||||||
|
0:146 move second child to first child (mediump int)
|
||||||
|
0:146 'linearY' (mediump int)
|
||||||
|
0:146 'linearZ' (mediump int)
|
||||||
|
0:147 Branch: Break
|
||||||
|
0:148 case: with expression
|
||||||
|
0:148 Constant:
|
||||||
|
0:148 5 (const int)
|
||||||
|
0:? Sequence
|
||||||
|
0:150 Branch: Break
|
||||||
|
0:151 case: with expression
|
||||||
|
0:151 Constant:
|
||||||
|
0:151 6 (const int)
|
||||||
|
0:? Sequence
|
||||||
|
0:152 Constant:
|
||||||
|
0:152 4 (const int)
|
||||||
0:? Linker Objects
|
0:? Linker Objects
|
||||||
0:? 'c' (uniform mediump int)
|
0:? 'c' (uniform mediump int)
|
||||||
0:? 'd' (uniform mediump int)
|
0:? 'd' (uniform mediump int)
|
||||||
|
|||||||
@ -118,4 +118,37 @@ void main()
|
|||||||
|
|
||||||
case 5: // ERROR
|
case 5: // ERROR
|
||||||
default: // ERROR
|
default: // ERROR
|
||||||
|
|
||||||
|
switch (0) {
|
||||||
|
default:
|
||||||
|
int onlyInSwitch = 0;
|
||||||
|
}
|
||||||
|
onlyInSwitch; // ERROR
|
||||||
|
|
||||||
|
switch (0) {
|
||||||
|
default:
|
||||||
|
int x; // current "no statement" ERROR, but maybe this should count as a statement, or the semantic check removed
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (c) {
|
||||||
|
case 1:
|
||||||
|
{
|
||||||
|
int nestedX;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 2:
|
||||||
|
nestedX; // ERROR
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
int linearZ;
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
int linearY = linearZ;
|
||||||
|
break;
|
||||||
|
case 5: // ERROR? that branch bypassed an initializer?
|
||||||
|
const int linearC = 4;
|
||||||
|
break;
|
||||||
|
case 6: // ERROR? that branch bypassed an initializer?
|
||||||
|
linearC;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2255,14 +2255,18 @@ condition
|
|||||||
switch_statement
|
switch_statement
|
||||||
: SWITCH LEFT_PAREN expression RIGHT_PAREN {
|
: SWITCH LEFT_PAREN expression RIGHT_PAREN {
|
||||||
// start new switch sequence on the switch stack
|
// start new switch sequence on the switch stack
|
||||||
|
++parseContext.controlFlowNestingLevel;
|
||||||
parseContext.switchSequenceStack.push_back(new TIntermSequence);
|
parseContext.switchSequenceStack.push_back(new TIntermSequence);
|
||||||
parseContext.switchLevel.push_back(parseContext.controlFlowNestingLevel);
|
parseContext.switchLevel.push_back(parseContext.controlFlowNestingLevel);
|
||||||
|
parseContext.symbolTable.push();
|
||||||
}
|
}
|
||||||
LEFT_BRACE switch_statement_list RIGHT_BRACE {
|
LEFT_BRACE switch_statement_list RIGHT_BRACE {
|
||||||
$$ = parseContext.addSwitch($1.loc, $3, $7 ? $7->getAsAggregate() : 0);
|
$$ = parseContext.addSwitch($1.loc, $3, $7 ? $7->getAsAggregate() : 0);
|
||||||
delete parseContext.switchSequenceStack.back();
|
delete parseContext.switchSequenceStack.back();
|
||||||
parseContext.switchSequenceStack.pop_back();
|
parseContext.switchSequenceStack.pop_back();
|
||||||
parseContext.switchLevel.pop_back();
|
parseContext.switchLevel.pop_back();
|
||||||
|
parseContext.symbolTable.pop(&parseContext.defaultPrecision[0]);
|
||||||
|
--parseContext.controlFlowNestingLevel;
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user