From f3a4904f2105ec68e4b28002e57517b96ce0570a Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 29 Nov 2018 22:23:30 +0000 Subject: [PATCH] Hack: union compound literal fix --- src/gb/gb.h | 2 +- src/ir.cpp | 16 ++++++++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/gb/gb.h b/src/gb/gb.h index 0243405db..4e7473432 100644 --- a/src/gb/gb.h +++ b/src/gb/gb.h @@ -982,7 +982,7 @@ typedef struct gbThread { gbSemaphore semaphore; isize stack_size; - b32 is_running; + b32 volatile is_running; } gbThread; GB_DEF void gb_thread_init (gbThread *t); diff --git a/src/ir.cpp b/src/ir.cpp index 52b97e28d..ad54b6213 100644 --- a/src/ir.cpp +++ b/src/ir.cpp @@ -4330,7 +4330,6 @@ void ir_emit_store_union_variant(irProcedure *proc, irValue *parent, irValue *va gbAllocator a = ir_allocator(); irValue *underlying = ir_emit_conv(proc, parent, alloc_type_pointer(variant_type)); - irValue *v = variant; ir_emit_store(proc, underlying, variant); Type *t = type_deref(ir_type(parent)); @@ -7026,9 +7025,18 @@ irAddr ir_build_addr(irProcedure *proc, Ast *expr) { GB_ASSERT(ir_type(field_expr)->kind != Type_Tuple); - irValue *fv = ir_emit_conv(proc, field_expr, ft); - irValue *gep = ir_emit_struct_ep(proc, v, cast(i32)index); - ir_emit_store(proc, gep, fv); + Type *fet = ir_type(field_expr); + // HACK TODO(bill): THIS IS A MASSIVE HACK!!!! + if (is_type_union(ft) && !are_types_identical(fet, ft)) { + GB_ASSERT(union_variant_index(ft, fet) > 0); + + irValue *gep = ir_emit_struct_ep(proc, v, cast(i32)index); + ir_emit_store_union_variant(proc, gep, field_expr, fet); + } else { + irValue *fv = ir_emit_conv(proc, field_expr, ft); + irValue *gep = ir_emit_struct_ep(proc, v, cast(i32)index); + ir_emit_store(proc, gep, fv); + } } } break;