diff options
| -rw-r--r-- | evaluate.c | 16 | ||||
| -rw-r--r-- | validation/badtype4.c | 7 |
2 files changed, 15 insertions, 8 deletions
@@ -2663,20 +2663,20 @@ static void evaluate_switch_statement(struct statement *stmt) { struct symbol *sym; struct expression *enumcase = NULL; - struct expression **enumcase_holder; + struct expression **enumcase_holder = &enumcase; + struct expression *sel = stmt->switch_expression; - evaluate_expression(stmt->switch_expression); + evaluate_expression(sel); evaluate_statement(stmt->switch_statement); - if (!stmt->switch_expression) + if (!sel) return; - enumcase_holder = is_enum_type(stmt->switch_expression->ctype) - ? NULL /* Only check cases against switch */ - : &enumcase; + if (sel->ctype && is_enum_type(sel->ctype)) + enumcase_holder = NULL; /* Only check cases against switch */ FOR_EACH_PTR(stmt->switch_case->symbol_list, sym) { struct statement *case_stmt = sym->stmt; - check_case_type(stmt->switch_expression, case_stmt->case_expression, enumcase_holder); - check_case_type(stmt->switch_expression, case_stmt->case_to, enumcase_holder); + check_case_type(sel, case_stmt->case_expression, enumcase_holder); + check_case_type(sel, case_stmt->case_to, enumcase_holder); } END_FOR_EACH_PTR(sym); } diff --git a/validation/badtype4.c b/validation/badtype4.c new file mode 100644 index 00000000..4f0c494b --- /dev/null +++ b/validation/badtype4.c @@ -0,0 +1,7 @@ +void a(void) +{ + switch(x) { + case 1: + break; + } +} |
