diff options
| author | gingerBill <bill@gingerbill.org> | 2024-05-10 14:22:43 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2024-05-10 14:22:43 +0100 |
| commit | ad5c9469d82e85b0d1fe4dbeb5cce98420e5a0ab (patch) | |
| tree | e395e2226e885b8377a6854d0fbf7739a5407f3a /src/check_stmt.cpp | |
| parent | 710bb4369f45ee6dfa8b66e67e25d91a15000a65 (diff) | |
Fix #3522
Diffstat (limited to 'src/check_stmt.cpp')
| -rw-r--r-- | src/check_stmt.cpp | 34 |
1 files changed, 32 insertions, 2 deletions
diff --git a/src/check_stmt.cpp b/src/check_stmt.cpp index cccbab4f6..c018077f9 100644 --- a/src/check_stmt.cpp +++ b/src/check_stmt.cpp @@ -161,8 +161,7 @@ gb_internal bool check_is_terminating_list(Slice<Ast *> const &stmts, String con } gb_internal bool check_has_break_list(Slice<Ast *> const &stmts, String const &label, bool implicit) { - for_array(i, stmts) { - Ast *stmt = stmts[i]; + for (Ast *stmt : stmts) { if (check_has_break(stmt, label, implicit)) { return true; } @@ -170,6 +169,14 @@ gb_internal bool check_has_break_list(Slice<Ast *> const &stmts, String const &l return false; } +gb_internal bool check_has_break_expr_list(Slice<Ast *> const &exprs, String const &label) { + for (Ast *expr : exprs) { + if (expr && expr->viral_state_flags & ViralStateFlag_ContainsOrBreak) { + return true; + } + } + return false; +} gb_internal bool check_has_break(Ast *stmt, String const &label, bool implicit) { switch (stmt->kind) { @@ -227,6 +234,20 @@ gb_internal bool check_has_break(Ast *stmt, String const &label, bool implicit) return true; } break; + + case Ast_ValueDecl: + if (stmt->ValueDecl.is_mutable && check_has_break_expr_list(stmt->ValueDecl.values, label)) { + return true; + } + break; + case Ast_AssignStmt: + if (check_has_break_expr_list(stmt->AssignStmt.lhs, label)) { + return true; + } + if (check_has_break_expr_list(stmt->AssignStmt.rhs, label)) { + return true; + } + break; } return false; @@ -250,6 +271,15 @@ gb_internal bool check_is_terminating(Ast *node, String const &label) { return check_is_terminating(unparen_expr(es->expr), label); case_end; + case_ast_node(vd, ValueDecl, node); + return check_has_break_expr_list(vd->values, label); + case_end; + + case_ast_node(as, AssignStmt, node); + return check_has_break_expr_list(as->lhs, label) || + check_has_break_expr_list(as->rhs, label); + case_end; + case_ast_node(bs, BranchStmt, node); return bs->token.kind == Token_fallthrough; case_end; |