diff --git a/releasenotes.md b/releasenotes.md index db57d140f..0ee3052a3 100644 --- a/releasenotes.md +++ b/releasenotes.md @@ -18,6 +18,7 @@ - Compiler assertion when defining a function with return type untyped_list #2368. - Compiler assert when using generic parameters list without any parameters. #2369 - Parsing difference between "0x00." and "0X00." literals #2371 +- Fixed bug generating `$c += 1` when `$c` was derived from a pointer but behind a cast. ### Stdlib changes - Add `==` to `Pair`, `Triple` and TzDateTime. Add print to `Pair` and `Triple`. diff --git a/src/compiler/sema_expr.c b/src/compiler/sema_expr.c index de4a0a7b5..74955fa85 100644 --- a/src/compiler/sema_expr.c +++ b/src/compiler/sema_expr.c @@ -6764,13 +6764,13 @@ static bool sema_binary_analyse_ct_op_assign(SemaContext *context, Expr *expr, E if (!sema_expr_analyse_binary(context, NULL, expr, NULL)) return false; expr->resolve_status = RESOLVE_DONE; - if (!sema_cast_const(expr)) + if (!expr_is_runtime_const(expr)) { - RETURN_SEMA_ERROR(exprptr(expr->binary_expr.right), "Expected a constant expression."); + RETURN_SEMA_ERROR(expr, "Expected this to result in a constant expression."); } left_var->var.init_expr = expr; - left->type = expr->type; + left_var->type = expr->type; return true; } diff --git a/test/test_suite/compile_time/compile_time_pointer_offset.c3t b/test/test_suite/compile_time/compile_time_pointer_offset.c3t new file mode 100644 index 000000000..8d872c7d3 --- /dev/null +++ b/test/test_suite/compile_time/compile_time_pointer_offset.c3t @@ -0,0 +1,19 @@ +// #target: macos-x64 +module test; +macro checker() +{ + long $b = (iptr) ((uint*) bool.typeid); + $b += 1; + return $b; +} +fn int main() +{ + long x = checker(); + return 0; +} + +/* #expect: test.ll + + %x = alloca i64, align 8 + store i64 ptrtoint (ptr getelementptr (i8, ptr @"$ct.bool", i64 1) to i64), ptr %x, align 8 + ret i32 0 \ No newline at end of file