diff options
| author | gingerBill <bill@gingerbill.org> | 2017-11-25 11:16:23 +0000 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2017-11-25 11:16:23 +0000 |
| commit | adb6c7637e8748b19e550e45cba42d1155657249 (patch) | |
| tree | 7fc41a587be0d253da7ca5ab76d88d8c5555cc81 /src/check_stmt.cpp | |
| parent | 425f83b17d1c15b7486a5f321ad9bfae405f07fa (diff) | |
Fix 'fallthrough'
Diffstat (limited to 'src/check_stmt.cpp')
| -rw-r--r-- | src/check_stmt.cpp | 21 |
1 files changed, 8 insertions, 13 deletions
diff --git a/src/check_stmt.cpp b/src/check_stmt.cpp index a04679b3a..96f253d07 100644 --- a/src/check_stmt.cpp +++ b/src/check_stmt.cpp @@ -1193,8 +1193,10 @@ void check_stmt_internal(Checker *c, AstNode *node, u32 flags) { case_ast_node(ss, SwitchStmt, node); Operand x = {}; - mod_flags |= Stmt_BreakAllowed; + mod_flags |= Stmt_BreakAllowed | Stmt_FallthroughAllowed; check_open_scope(c, node); + defer (check_close_scope(c)); + check_label(c, ss->label); // TODO(bill): What should the label's "scope" be? if (ss->init != nullptr) { @@ -1251,9 +1253,10 @@ void check_stmt_internal(Checker *c, AstNode *node, u32 flags) { Map<TypeAndToken> seen = {}; // NOTE(bill): Multimap map_init(&seen, heap_allocator()); + defer (map_destroy(&seen)); - for_array(i, bs->stmts) { - AstNode *stmt = bs->stmts[i]; + for_array(stmt_index, bs->stmts) { + AstNode *stmt = bs->stmts[stmt_index]; if (stmt->kind != AstNode_CaseClause) { // NOTE(bill): error handled by above multiple default checker continue; @@ -1381,17 +1384,9 @@ void check_stmt_internal(Checker *c, AstNode *node, u32 flags) { } check_open_scope(c, stmt); - u32 ft_flags = mod_flags; - if (i+1 < bs->stmts.count) { - ft_flags |= Stmt_FallthroughAllowed; - } - check_stmt_list(c, cc->stmts, ft_flags); + check_stmt_list(c, cc->stmts, mod_flags); check_close_scope(c); } - - map_destroy(&seen); - - check_close_scope(c); case_end; case_ast_node(ss, TypeSwitchStmt, node); @@ -1587,7 +1582,7 @@ void check_stmt_internal(Checker *c, AstNode *node, u32 flags) { break; case Token_fallthrough: if ((flags & Stmt_FallthroughAllowed) == 0) { - error(token, "'fallthrough' statement in illegal position"); + error(token, "'fallthrough' statement in illegal position, expected at the end of a 'case' block"); } break; default: |