diff --git a/src/compiler/llvm_codegen_expr.c b/src/compiler/llvm_codegen_expr.c index 86e4e4740..2fd15bbc8 100644 --- a/src/compiler/llvm_codegen_expr.c +++ b/src/compiler/llvm_codegen_expr.c @@ -676,7 +676,7 @@ static inline void gencontext_emit_subscript(GenContext *c, BEValue *value, Expr { // From back should always be folded. assert(!expr_is_const(expr) || !expr->subscript_expr.range.start_from_end); - needs_len = (active_target.feature.safe_mode && expr_is_const(expr)) || expr->subscript_expr.range.start_from_end; + needs_len = (active_target.feature.safe_mode && !expr_is_const(expr)) || expr->subscript_expr.range.start_from_end; } if (needs_len) { diff --git a/test/test_suite/arrays/array_bounds_check.c3t b/test/test_suite/arrays/array_bounds_check.c3t new file mode 100644 index 000000000..7b1171eeb --- /dev/null +++ b/test/test_suite/arrays/array_bounds_check.c3t @@ -0,0 +1,32 @@ +// #target: macos-x64 +// #safe: yes +module testing; +import std::io; + +const FOO = Foo[2]{ {11}, {22} }; + +struct Foo +{ + int x; +} + +fn void! main() +{ + for (usz i = 0; i < 20; i++) + { + int x = FOO[i].x; + } +} + +/* #expect: testing.ll + +loop.cond: ; preds = %checkok, %entry + %0 = load i64, ptr %i, align 8 + %gt = icmp ugt i64 20, %0 + br i1 %gt, label %loop.body, label %loop.exit +loop.body: ; preds = %loop.cond + %1 = load i64, ptr %i, align 8 + %ge = icmp uge i64 %1, 2 + br i1 %ge, label %panic, label %checkok +panic: ; preds = %loop.body + store i64 2, ptr %taddr, align 8