From a816a78e98bd60cee6fe8dc5d75cbce1642ec165 Mon Sep 17 00:00:00 2001 From: Christoffer Lerno Date: Thu, 20 Nov 2025 12:09:38 +0100 Subject: [PATCH] Fix alignment. --- src/compiler/llvm_codegen_expr.c | 7 ++++++- test/test_suite/safe/deref_absolute.c3t | 18 +++++++++++++++--- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/compiler/llvm_codegen_expr.c b/src/compiler/llvm_codegen_expr.c index 01a45747f..1dbcae5f9 100644 --- a/src/compiler/llvm_codegen_expr.c +++ b/src/compiler/llvm_codegen_expr.c @@ -2371,7 +2371,12 @@ static inline void llvm_emit_deref(GenContext *c, BEValue *value, Expr *inner, T llvm_emit_expr(c, value, inner); llvm_value_rvalue(c, value); AlignSize alignment = type_abi_alignment(type); - if (safe_mode_enabled() && !expr_is_const(inner)) + bool is_const = expr_is_const(inner); + if (is_const) + { + alignment = type_min_alignment(inner->const_expr.ptr, alignment); + } + if (safe_mode_enabled() && !is_const) { LLVMValueRef check = LLVMBuildICmp(c->builder, LLVMIntEQ, value->value, llvm_get_zero(c, inner->type), "checknull"); scratch_buffer_clear(); diff --git a/test/test_suite/safe/deref_absolute.c3t b/test/test_suite/safe/deref_absolute.c3t index 7fb637894..2f4b66de4 100644 --- a/test/test_suite/safe/deref_absolute.c3t +++ b/test/test_suite/safe/deref_absolute.c3t @@ -1,6 +1,18 @@ -module main; +// #target: macos-x64 +module test; -fn void main() +fn int main() { int x = *(int*)1; -} \ No newline at end of file + return 0; +} + +/* #expect: test.ll + +define i32 @main() #0 { +entry: + %x = alloca i32, align 4 + %0 = load i32, ptr inttoptr (i64 1 to ptr), align 1 + store i32 %0, ptr %x, align 4 + ret i32 0 +}