Disallow labelled branches in defer - fix #3960

This commit is contained in:
gingerBill
2024-08-24 12:47:29 +01:00
parent ca4d91a8a3
commit 683dde1fa0
+8
View File
@@ -199,6 +199,9 @@ gb_internal bool check_has_break(Ast *stmt, String const &label, bool implicit)
} }
break; break;
case Ast_DeferStmt:
return check_has_break(stmt->DeferStmt.stmt, label, implicit);
case Ast_BlockStmt: case Ast_BlockStmt:
return check_has_break_list(stmt->BlockStmt.stmts, label, implicit); 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"); error(bs->label, "A branch statement's label name must be an identifier");
return; return;
} }
Ast *ident = bs->label; Ast *ident = bs->label;
String name = ident->Ident.token.string; String name = ident->Ident.token.string;
Operand o = {}; Operand o = {};
@@ -2737,6 +2741,10 @@ gb_internal void check_stmt_internal(CheckerContext *ctx, Ast *node, u32 flags)
break; break;
} }
if (ctx->in_defer) {
error(bs->label, "A labelled '%.*s' cannot be used within a 'defer'", LIT(token.string));
}
} }
case_end; case_end;