From 51364a9d1bbb920ac973314d9989f489bbaa4430 Mon Sep 17 00:00:00 2001 From: Christoffer Lerno Date: Thu, 15 Jan 2026 23:33:26 +0100 Subject: [PATCH] Another fix in immediately rethrowing a value in an assignment #2689 --- src/compiler/llvm_codegen_expr.c | 2 +- .../errors/rethrow_macro_cost_err.c3t | 23 +++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 test/test_suite/errors/rethrow_macro_cost_err.c3t diff --git a/src/compiler/llvm_codegen_expr.c b/src/compiler/llvm_codegen_expr.c index a05eb0ae8..8898b41d3 100644 --- a/src/compiler/llvm_codegen_expr.c +++ b/src/compiler/llvm_codegen_expr.c @@ -206,7 +206,7 @@ BEValue llvm_emit_assign_expr(GenContext *c, BEValue *ref, Expr *ref_expr, Expr else { llvm_emit_expr(c, &value, expr); - if (ref_expr) llvm_emit_expr(c, ref, ref_expr); + if (ref_expr && c->current_block) llvm_emit_expr(c, ref, ref_expr); } if (!c->current_block) goto AFTER_STORE; if (value.type != type_void) llvm_store(c, ref, &value); diff --git a/test/test_suite/errors/rethrow_macro_cost_err.c3t b/test/test_suite/errors/rethrow_macro_cost_err.c3t new file mode 100644 index 000000000..22632e11e --- /dev/null +++ b/test/test_suite/errors/rethrow_macro_cost_err.c3t @@ -0,0 +1,23 @@ +module testing_branch; +import std::io; + +faultdef OH_NO; +const C = 1; + +fn void main() => do_thing()!!; + +fn void? do_thing() +{ + int* a_value = mem::alloc_array(int, 4); + // Change 'C' below to any integer value and the assert goes away. + *(int128*)a_value = may_fault(int128, "-123", C)!; + io::printfn("Value: %d", *a_value); +} + +macro may_fault($ArgType, something, $incoming) +{ + $switch $incoming: + $case 1: return OH_NO?; + $default: return something.to_integer($ArgType); + $endswitch +} \ No newline at end of file