aboutsummaryrefslogtreecommitdiff
path: root/src/check_stmt.cpp
diff options
context:
space:
mode:
authorAndreas T Jonsson <mail@andreasjonsson.se>2024-05-13 09:21:32 +0200
committerAndreas T Jonsson <mail@andreasjonsson.se>2024-05-13 09:21:32 +0200
commit5d82f0cad5e0500d577bb03e1c175716d4d8b995 (patch)
tree86b4662246c85cfa2a58ee22d101cc8ffc14df54 /src/check_stmt.cpp
parentf428e30211c3113ac7c7918f9a0f5c03cc7b4669 (diff)
parent1183f4794b5bd3f1afddbb351c941a8a617a085f (diff)
Merge branch 'master' into netbsd
Diffstat (limited to 'src/check_stmt.cpp')
-rw-r--r--src/check_stmt.cpp34
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;