From 912a45769bc95f248fd9b1dda14535f4eca9463c Mon Sep 17 00:00:00 2001 From: ARay Date: Fri, 19 Jun 2026 15:39:24 +0300 Subject: [PATCH] fix issue 6853: when iterating the values of an array literal,if one of the values is a function with multiple returns, it doesn't offset the struct field index by the number of values. --- src/llvm_backend_const.cpp | 13 +++++++++++-- tests/issues/test_issue_6853.odin | 5 +++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/llvm_backend_const.cpp b/src/llvm_backend_const.cpp index 20df5fdd0..a59ed4401 100644 --- a/src/llvm_backend_const.cpp +++ b/src/llvm_backend_const.cpp @@ -1967,8 +1967,9 @@ gb_internal lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, Ty } } } else { + isize multiple_return_offset = 0; for_array(i, cl->elems) { - Entity *f = type->Struct.fields[i]; + Entity *f = type->Struct.fields[i+multiple_return_offset]; TypeAndValue tav = cl->elems[i]->tav; // INFO: dead code: @@ -1978,11 +1979,19 @@ gb_internal lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, Ty // val = tav.value; // } + if (is_type_tuple(tav.type)){ + multiple_return_offset += tav.type->Tuple.variables.count-1; + } + i32 index = field_remapping[f->Variable.field_index]; + + if (elem_type_can_be_constant(f->type)) { lbValue value = lb_const_value(m, f->type, tav.value, tav.type, cc); LLVMTypeRef value_type = LLVMTypeOf(value.value); - GB_ASSERT_MSG(lb_sizeof(value_type) == type_size_of(f->type), "%s vs %s", LLVMPrintTypeToString(value_type), type_to_string(f->type)); + isize lb_sizeof_value_type = lb_sizeof(value_type); + isize type_size_of_f_type = type_size_of(f->type); + GB_ASSERT_MSG(lb_sizeof_value_type ==type_size_of_f_type, "%s vs %s", LLVMPrintTypeToString(value_type), type_to_string(f->type)); values[index] = value.value; visited[index] = true; } diff --git a/tests/issues/test_issue_6853.odin b/tests/issues/test_issue_6853.odin index af0bcebe5..fec4951a5 100644 --- a/tests/issues/test_issue_6853.odin +++ b/tests/issues/test_issue_6853.odin @@ -22,4 +22,9 @@ test_issue_6853 :: proc(t: ^testing.T) { case2 :: proc() -> (u64, u64) {return 2, 3} test2 := test_s{1, case2(), 4, 5} testing.expect_value(t, test2, expected) + + case3_1 :: proc() -> (u64, u64) {return 1, 2} + case3_2 :: proc() -> (u64, u64) {return 3, 4} + test3 := test_s{case3_1(), case3_2(), 5} + testing.expect_value(t, test3, expected) }