From 56f8008d85260113abfd91ea8e1f2caa6dc36147 Mon Sep 17 00:00:00 2001 From: Christoffer Lerno Date: Mon, 29 Dec 2025 22:09:39 +0100 Subject: [PATCH] - Parse error in `$defined` was not handled correctly, leading to an assertion. --- releasenotes.md | 1 + src/compiler/parse_expr.c | 2 +- test/test_suite/compile_time/defined_parse_error.c3 | 4 ++++ 3 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 test/test_suite/compile_time/defined_parse_error.c3 diff --git a/releasenotes.md b/releasenotes.md index 3d61f89b3..cc43652b3 100644 --- a/releasenotes.md +++ b/releasenotes.md @@ -37,6 +37,7 @@ - Compiler assert when passing returning CT failure immediately rethrown #2689. - Converting between simd/non-simd bool vector would hit a compiler assert. #2691 - `i` suffixes were not caught when n < 8, causing an assert. +- Parse error in `$defined` was not handled correctly, leading to an assertion. ### Stdlib changes - Add `ThreadPool` join function to wait for all threads to finish in the pool without destroying the threads. diff --git a/src/compiler/parse_expr.c b/src/compiler/parse_expr.c index b38382468..aeb0573b4 100644 --- a/src/compiler/parse_expr.c +++ b/src/compiler/parse_expr.c @@ -1209,7 +1209,7 @@ static Expr *parse_ct_defined(ParseContext *c, Expr *left, SourceSpan lhs_start vec_add(defined->expression_list, expr); if (!try_consume(c, TOKEN_COMMA)) { - CONSUME_OR_RET(TOKEN_RPAREN, false); + CONSUME_OR_RET(TOKEN_RPAREN, poisoned_expr); break; } } diff --git a/test/test_suite/compile_time/defined_parse_error.c3 b/test/test_suite/compile_time/defined_parse_error.c3 new file mode 100644 index 000000000..22f4d8bbb --- /dev/null +++ b/test/test_suite/compile_time/defined_parse_error.c3 @@ -0,0 +1,4 @@ +fn void main() +{ + $defined(usz a*); // #error: Expected ')' +} \ No newline at end of file