From 910fc6e364a12bbe5f2328de4c610220c834829f Mon Sep 17 00:00:00 2001 From: Christoffer Lerno Date: Mon, 3 Mar 2025 01:21:01 +0100 Subject: [PATCH] Post and pre-decrement operators switched places for vector elements. #2010. --- releasenotes.md | 1 + src/compiler/llvm_codegen_expr.c | 2 +- test/test_suite/vector/vector_inc.c3t | 20 ++++++++++++++++++++ test/unit/regression/inc_dec.c3 | 2 +- 4 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 test/test_suite/vector/vector_inc.c3t diff --git a/releasenotes.md b/releasenotes.md index 19ce0ab71..ab191f07c 100644 --- a/releasenotes.md +++ b/releasenotes.md @@ -18,6 +18,7 @@ ### Fixes - Fix address sanitizer to work on MachO targets (e.g. MacOS). +- Post and pre-decrement operators switched places for vector elements #2010. ### Stdlib changes - `new_*` functions in general moved to version without `new_` prefix. diff --git a/src/compiler/llvm_codegen_expr.c b/src/compiler/llvm_codegen_expr.c index 99e62c82a..02bf2992d 100644 --- a/src/compiler/llvm_codegen_expr.c +++ b/src/compiler/llvm_codegen_expr.c @@ -2247,7 +2247,7 @@ static inline void llvm_emit_pre_post_inc_dec_vector(GenContext *c, BEValue *val llvm_store_raw(c, &addr, vector); // And set the return value. - llvm_value_set(value, pre ? current_res.value : new_value, element); + llvm_value_set(value, pre ? new_value : current_res.value, element); } /** diff --git a/test/test_suite/vector/vector_inc.c3t b/test/test_suite/vector/vector_inc.c3t new file mode 100644 index 000000000..f3b4d2827 --- /dev/null +++ b/test/test_suite/vector/vector_inc.c3t @@ -0,0 +1,20 @@ +// #target: macos-x64 +module test; +fn void main() +{ + float[<1>] myvar = { 3 }; + myvar.x = ++myvar.x * 2; +} + +/* #expect: test.ll + + %0 = load <1 x float>, ptr %myvar, align 4 + %1 = load <1 x float>, ptr %myvar, align 4 + %2 = extractelement <1 x float> %1, i64 0 + %fincdec = fadd float %2, 1.000000e+00 + %3 = insertelement <1 x float> %1, float %fincdec, i64 0 + store <1 x float> %3, ptr %myvar, align 4 + %fmul = fmul float %fincdec, 2.000000e+00 + %elemset = insertelement <1 x float> %0, float %fmul, i64 0 + store <1 x float> %elemset, ptr %myvar, align 4 + ret void diff --git a/test/unit/regression/inc_dec.c3 b/test/unit/regression/inc_dec.c3 index 3118df781..4e7446855 100644 --- a/test/unit/regression/inc_dec.c3 +++ b/test/unit/regression/inc_dec.c3 @@ -9,7 +9,7 @@ fn void vector_inc_dec() @test int[<3>] g = x--; assert(x == { 0, 0, -1 }); assert(y == { 1, 0, 1 }); - assert(z == 0 && zz == 1); + assert(z == 1 && zz == 0); assert(g == { 1, 1, 0 }); }