diff options
| author | flysand7 <yyakut.ac@gmail.com> | 2023-12-06 00:23:41 +1100 |
|---|---|---|
| committer | flysand7 <yyakut.ac@gmail.com> | 2023-12-06 00:23:41 +1100 |
| commit | 92d3a681cd6cc2aceb0865d4bffdf8a112f6f0d6 (patch) | |
| tree | 6feb95445ee9f39f3c4e1dadc1ecb9d0410ec0c1 /src/llvm_backend_general.cpp | |
| parent | cb66ed52cefde3274b9b055a1fecbf938e4b5155 (diff) | |
| parent | 65afe6f70d6baa2d4070791325701e38d6f2df61 (diff) | |
Merge branch 'master' into sys-linux-additions
Diffstat (limited to 'src/llvm_backend_general.cpp')
| -rw-r--r-- | src/llvm_backend_general.cpp | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/src/llvm_backend_general.cpp b/src/llvm_backend_general.cpp index fdcf94f29..c149ec853 100644 --- a/src/llvm_backend_general.cpp +++ b/src/llvm_backend_general.cpp @@ -1332,6 +1332,8 @@ gb_internal void lb_emit_store_union_variant(lbProcedure *p, lbValue parent, lbV Type *pt = base_type(type_deref(parent.type)); GB_ASSERT(pt->kind == Type_Union); if (pt->Union.kind == UnionType_shared_nil) { + GB_ASSERT(type_size_of(variant_type)); + lbBlock *if_nil = lb_create_block(p, "shared_nil.if_nil"); lbBlock *if_not_nil = lb_create_block(p, "shared_nil.if_not_nil"); lbBlock *done = lb_create_block(p, "shared_nil.done"); @@ -1353,9 +1355,13 @@ gb_internal void lb_emit_store_union_variant(lbProcedure *p, lbValue parent, lbV } else { - lbValue underlying = lb_emit_conv(p, parent, alloc_type_pointer(variant_type)); - - lb_emit_store(p, underlying, variant); + if (type_size_of(variant_type) == 0) { + unsigned alignment = 1; + lb_mem_zero_ptr_internal(p, parent.value, pt->Union.variant_block_size, alignment, false); + } else { + lbValue underlying = lb_emit_conv(p, parent, alloc_type_pointer(variant_type)); + lb_emit_store(p, underlying, variant); + } lb_emit_store_union_variant_tag(p, parent, variant_type); } } |