aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2025-05-25 15:37:09 -0400
committerBruce Hill <bruce@bruce-hill.com>2025-05-25 15:37:09 -0400
commit145ccdea8ce8aa89448ea9302908b4dbc23d892f (patch)
tree8e21d08d2bd4e9df7bda27c4a2ff325e3d389e54 /src
parent1063d117e8d609379a50efdb9506a3a118ccca53 (diff)
Improved codegen for 'when' statements
Diffstat (limited to 'src')
-rw-r--r--src/compile.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/src/compile.c b/src/compile.c
index 5809c670..e09474a2 100644
--- a/src/compile.c
+++ b/src/compile.c
@@ -1070,9 +1070,10 @@ static CORD _compile_statement(env_t *env, ast_t *ast)
for (when_clause_t *clause = when->clauses; clause; clause = clause->next) {
if (clause->pattern->tag == Var) {
const char *clause_tag_name = Match(clause->pattern, Var)->name;
+ type_t *clause_type = clause->body ? get_type(env, clause->body) : Type(VoidType);
code = CORD_all(code, "case ", namespace_name(enum_t->env, enum_t->env->namespace, CORD_all("tag$", clause_tag_name)), ": {\n",
- compile_statement(env, clause->body),
- "break;\n"
+ compile_inline_block(env, clause->body),
+ (clause_type->tag == ReturnType || clause_type->tag == AbortType) ? CORD_EMPTY : "break;\n",
"}\n");
continue;
}