aboutsummaryrefslogtreecommitdiff
path: root/src/ir.cpp
diff options
context:
space:
mode:
authorTadeo Kondrak <me@tadeo.ca>2020-08-27 13:34:02 -0600
committerTadeo Kondrak <me@tadeo.ca>2020-09-07 06:23:50 -0600
commitacdf1f0bde9a07cae2fbe33739f5f4aee7989f7b (patch)
tree7ff786a8f58cb7e58d81792d14e0d611ba102709 /src/ir.cpp
parent771f35c59381dc6359640d7f572411d24e379240 (diff)
downloadzig-acdf1f0bde9a07cae2fbe33739f5f4aee7989f7b.tar.gz
zig-acdf1f0bde9a07cae2fbe33739f5f4aee7989f7b.zip
@Type for union fixes
Diffstat (limited to 'src/ir.cpp')
-rw-r--r--src/ir.cpp7
1 files changed, 6 insertions, 1 deletions
diff --git a/src/ir.cpp b/src/ir.cpp
index 36852de706..6cb5d8bc2d 100644
--- a/src/ir.cpp
+++ b/src/ir.cpp
@@ -26222,14 +26222,19 @@ static ZigType *type_info_to_type(IrAnalyze *ira, IrInst *source_instr, ZigTypeI
assert(payload->type == ir_type_info_get_type(ira, "Union", nullptr));
ZigValue *layout_value = get_const_field(ira, source_instr->source_node, payload, "layout", 0);
+ if (layout_value == nullptr)
+ return ira->codegen->invalid_inst_gen->value->type;
assert(layout_value->special == ConstValSpecialStatic);
assert(layout_value->type == ir_type_info_get_type(ira, "ContainerLayout", nullptr));
ContainerLayout layout = (ContainerLayout)bigint_as_u32(&layout_value->data.x_enum_tag);
ZigType *tag_type = get_const_field_meta_type_optional(ira, source_instr->source_node, payload, "tag_type", 1);
+ if (tag_type != nullptr && type_is_invalid(tag_type)) {
+ return ira->codegen->invalid_inst_gen->value->type;
+ }
if (tag_type != nullptr && tag_type->id != ZigTypeIdEnum) {
ir_add_error(ira, source_instr, buf_sprintf(
- "union tag type must be an enum, not %s", type_id_name(tag_type->id)));
+ "expected enum type, found '%s'", type_id_name(tag_type->id)));
return ira->codegen->invalid_inst_gen->value->type;
}