aboutsummaryrefslogtreecommitdiff
path: root/src/check_stmt.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2017-11-25 11:16:23 +0000
committergingerBill <bill@gingerbill.org>2017-11-25 11:16:23 +0000
commitadb6c7637e8748b19e550e45cba42d1155657249 (patch)
tree7fc41a587be0d253da7ca5ab76d88d8c5555cc81 /src/check_stmt.cpp
parent425f83b17d1c15b7486a5f321ad9bfae405f07fa (diff)
Fix 'fallthrough'
Diffstat (limited to 'src/check_stmt.cpp')
-rw-r--r--src/check_stmt.cpp21
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: