aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2024-08-24 12:47:29 +0100
committergingerBill <bill@gingerbill.org>2024-08-24 12:47:29 +0100
commit683dde1fa011056477423ded1bc6098ac2636675 (patch)
treeb8ca0479aef07eff5a9461efbdd10c56828c46cf
parentca4d91a8a33c2209ef9f6708fb5effc278a2b9f5 (diff)
Disallow labelled branches in `defer` - fix #3960
-rw-r--r--src/check_stmt.cpp8
1 files changed, 8 insertions, 0 deletions
diff --git a/src/check_stmt.cpp b/src/check_stmt.cpp
index 12156df01..1ef51e585 100644
--- a/src/check_stmt.cpp
+++ b/src/check_stmt.cpp
@@ -199,6 +199,9 @@ gb_internal bool check_has_break(Ast *stmt, String const &label, bool implicit)
}
break;
+ case Ast_DeferStmt:
+ return check_has_break(stmt->DeferStmt.stmt, label, implicit);
+
case Ast_BlockStmt:
return check_has_break_list(stmt->BlockStmt.stmts, label, implicit);
@@ -2706,6 +2709,7 @@ gb_internal void check_stmt_internal(CheckerContext *ctx, Ast *node, u32 flags)
error(bs->label, "A branch statement's label name must be an identifier");
return;
}
+
Ast *ident = bs->label;
String name = ident->Ident.token.string;
Operand o = {};
@@ -2737,6 +2741,10 @@ gb_internal void check_stmt_internal(CheckerContext *ctx, Ast *node, u32 flags)
break;
}
+
+ if (ctx->in_defer) {
+ error(bs->label, "A labelled '%.*s' cannot be used within a 'defer'", LIT(token.string));
+ }
}
case_end;