glsl: Add error case for switch() with two default cases.

Fixes piglit switch-case-duplicated.vert.

NOTE: This is a candidate for the 8.0 branch.

Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
This commit is contained in:
Eric Anholt 2012-01-30 09:50:35 -08:00
parent 140632190c
commit 57e44371a5
2 changed files with 16 additions and 0 deletions

View File

@ -3537,6 +3537,7 @@ ast_switch_statement::hir(exec_list *instructions,
state->switch_state.switch_nesting_ast = this;
state->switch_state.labels_ht = hash_table_ctor(0, hash_table_pointer_hash,
hash_table_pointer_compare);
state->switch_state.previous_default = NULL;
/* Initalize is_fallthru state to false.
*/
@ -3749,6 +3750,20 @@ ast_switch_statement::hir(exec_list *instructions,
instructions->push_tail(set_fallthru_on_test);
} else { /* default case */
if (state->switch_state.previous_default) {
printf("a\n");
YYLTYPE loc = this->get_location();
_mesa_glsl_error(& loc, state,
"multiple default labels in one switch");
printf("b\n");
loc = state->switch_state.previous_default->get_location();
_mesa_glsl_error(& loc, state,
"this is the first default label");
}
state->switch_state.previous_default = this;
/* Set falltrhu state.
*/
ir_assignment *set_fallthru =

View File

@ -51,6 +51,7 @@ struct glsl_switch_state {
/** Table of constant values already used in case labels */
struct hash_table *labels_ht;
class ast_case_label *previous_default;
bool is_switch_innermost; // if switch stmt is closest to break, ...
};