aboutsummaryrefslogtreecommitdiff
path: root/src/llvm_backend_expr.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2024-08-18 12:35:25 +0100
committergingerBill <bill@gingerbill.org>2024-08-18 12:35:25 +0100
commit0e82a46047b619a6d70ec7e7a3e23a66794584b1 (patch)
treea6c3438c23de5311695eb4fb46ea48f5499523a1 /src/llvm_backend_expr.cpp
parentc4e0cbcd878f5984f559bdee1c6f02dc5a6e8ddc (diff)
Fix #3999
Diffstat (limited to 'src/llvm_backend_expr.cpp')
-rw-r--r--src/llvm_backend_expr.cpp7
1 files changed, 5 insertions, 2 deletions
diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp
index 2bbd48c1a..60b6237bf 100644
--- a/src/llvm_backend_expr.cpp
+++ b/src/llvm_backend_expr.cpp
@@ -3754,10 +3754,13 @@ gb_internal lbValue lb_get_using_variable(lbProcedure *p, Entity *e) {
lbValue v = {};
+ bool is_soa = false;
if (pv == nullptr && parent->flags & EntityFlag_SoaPtrField) {
+ is_soa = true;
// NOTE(bill): using SOA value (probably from for-in statement)
lbAddr parent_addr = lb_get_soa_variable_addr(p, parent);
- v = lb_addr_get_ptr(p, parent_addr);
+ Type *soa_ptr_type = alloc_type_soa_pointer(lb_addr_type(parent_addr));
+ v = lb_address_from_load_or_generate_local(p, lb_make_soa_pointer(p, soa_ptr_type, parent_addr.addr, parent_addr.soa.index));
} else if (pv != nullptr) {
v = *pv;
} else {
@@ -3765,7 +3768,7 @@ gb_internal lbValue lb_get_using_variable(lbProcedure *p, Entity *e) {
v = lb_build_addr_ptr(p, e->using_expr);
}
GB_ASSERT(v.value != nullptr);
- GB_ASSERT_MSG(parent->type == type_deref(v.type), "%s %s", type_to_string(parent->type), type_to_string(v.type));
+ GB_ASSERT_MSG(is_soa || parent->type == type_deref(v.type), "%s %s", type_to_string(parent->type), type_to_string(v.type));
lbValue ptr = lb_emit_deep_field_gep(p, v, sel);
if (parent->scope) {
if ((parent->scope->flags & (ScopeFlag_File|ScopeFlag_Pkg)) == 0) {