From f2dae7023f5b70d9286b7ff3d0d471bebad78292 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 14 Dec 2018 14:53:31 +0000 Subject: Fix polymorphic cast with pointers #303 --- src/ir.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'src/ir.cpp') diff --git a/src/ir.cpp b/src/ir.cpp index 388f15f31..a2a361318 100644 --- a/src/ir.cpp +++ b/src/ir.cpp @@ -4597,7 +4597,7 @@ irValue *ir_emit_conv(irProcedure *proc, irValue *value, Type *t) { st = base_type(st); Type *dt = t; - bool dt_is_ptr = is_type_pointer(dt); + bool dt_is_ptr = type_deref(dt) != dt; GB_ASSERT(is_type_struct(st) || is_type_raw_union(st)); String field_name = ir_lookup_subtype_polymorphic_field(proc->module->info, t, src_type); @@ -4608,13 +4608,15 @@ irValue *ir_emit_conv(irProcedure *proc, irValue *value, Type *t) { ir_emit_comment(proc, str_lit("cast - polymorphism")); if (st_is_ptr) { irValue *res = ir_emit_deep_field_gep(proc, value, sel); - if (!dt_is_ptr) { + Type *rt = ir_type(res); + if (!are_types_identical(rt, dt) && are_types_identical(type_deref(rt), dt)) { res = ir_emit_load(proc, res); } return res; } else { if (is_type_pointer(ir_type(value))) { - if (!dt_is_ptr) { + Type *rt = ir_type(value); + if (!are_types_identical(rt, dt) && are_types_identical(type_deref(rt), dt)) { value = ir_emit_load(proc, value); } else { value = ir_emit_deep_field_gep(proc, value, sel); -- cgit v1.2.3