| ... | @@ -539,12 +539,12 @@ static constexpr IrInstructionId ir_instruction_id(IrInstructionPanic *) { | ... | @@ -539,12 +539,12 @@ static constexpr IrInstructionId ir_instruction_id(IrInstructionPanic *) { |
| 539 | return IrInstructionIdPanic; | 539 | return IrInstructionIdPanic; |
| 540 | } | 540 | } |
| 541 | | 541 | |
| 542 | static constexpr IrInstructionId ir_instruction_id(IrInstructionEnumTagName *) { | 542 | static constexpr IrInstructionId ir_instruction_id(IrInstructionTagName *) { |
| 543 | return IrInstructionIdEnumTagName; | 543 | return IrInstructionIdTagName; |
| 544 | } | 544 | } |
| 545 | | 545 | |
| 546 | static constexpr IrInstructionId ir_instruction_id(IrInstructionEnumTagType *) { | 546 | static constexpr IrInstructionId ir_instruction_id(IrInstructionTagType *) { |
| 547 | return IrInstructionIdEnumTagType; | 547 | return IrInstructionIdTagType; |
| 548 | } | 548 | } |
| 549 | | 549 | |
| 550 | static constexpr IrInstructionId ir_instruction_id(IrInstructionFieldParentPtr *) { | 550 | static constexpr IrInstructionId ir_instruction_id(IrInstructionFieldParentPtr *) { |
| ... | @@ -2205,10 +2205,10 @@ static IrInstruction *ir_build_panic(IrBuilder *irb, Scope *scope, AstNode *sour | ... | @@ -2205,10 +2205,10 @@ static IrInstruction *ir_build_panic(IrBuilder *irb, Scope *scope, AstNode *sour |
| 2205 | return &instruction->base; | 2205 | return &instruction->base; |
| 2206 | } | 2206 | } |
| 2207 | | 2207 | |
| 2208 | static IrInstruction *ir_build_enum_tag_name(IrBuilder *irb, Scope *scope, AstNode *source_node, | 2208 | static IrInstruction *ir_build_tag_name(IrBuilder *irb, Scope *scope, AstNode *source_node, |
| 2209 | IrInstruction *target) | 2209 | IrInstruction *target) |
| 2210 | { | 2210 | { |
| 2211 | IrInstructionEnumTagName *instruction = ir_build_instruction<IrInstructionEnumTagName>(irb, scope, source_node); | 2211 | IrInstructionTagName *instruction = ir_build_instruction<IrInstructionTagName>(irb, scope, source_node); |
| 2212 | instruction->target = target; | 2212 | instruction->target = target; |
| 2213 | | 2213 | |
| 2214 | ir_ref_instruction(target, irb->current_basic_block); | 2214 | ir_ref_instruction(target, irb->current_basic_block); |
| ... | @@ -2216,10 +2216,10 @@ static IrInstruction *ir_build_enum_tag_name(IrBuilder *irb, Scope *scope, AstNo | ... | @@ -2216,10 +2216,10 @@ static IrInstruction *ir_build_enum_tag_name(IrBuilder *irb, Scope *scope, AstNo |
| 2216 | return &instruction->base; | 2216 | return &instruction->base; |
| 2217 | } | 2217 | } |
| 2218 | | 2218 | |
| 2219 | static IrInstruction *ir_build_enum_tag_type(IrBuilder *irb, Scope *scope, AstNode *source_node, | 2219 | static IrInstruction *ir_build_tag_type(IrBuilder *irb, Scope *scope, AstNode *source_node, |
| 2220 | IrInstruction *target) | 2220 | IrInstruction *target) |
| 2221 | { | 2221 | { |
| 2222 | IrInstructionEnumTagType *instruction = ir_build_instruction<IrInstructionEnumTagType>(irb, scope, source_node); | 2222 | IrInstructionTagType *instruction = ir_build_instruction<IrInstructionTagType>(irb, scope, source_node); |
| 2223 | instruction->target = target; | 2223 | instruction->target = target; |
| 2224 | | 2224 | |
| 2225 | ir_ref_instruction(target, irb->current_basic_block); | 2225 | ir_ref_instruction(target, irb->current_basic_block); |
| ... | @@ -3002,14 +3002,14 @@ static IrInstruction *ir_instruction_panic_get_dep(IrInstructionPanic *instructi | ... | @@ -3002,14 +3002,14 @@ static IrInstruction *ir_instruction_panic_get_dep(IrInstructionPanic *instructi |
| 3002 | } | 3002 | } |
| 3003 | } | 3003 | } |
| 3004 | | 3004 | |
| 3005 | static IrInstruction *ir_instruction_enumtagname_get_dep(IrInstructionEnumTagName *instruction, size_t index) { | 3005 | static IrInstruction *ir_instruction_enumtagname_get_dep(IrInstructionTagName *instruction, size_t index) { |
| 3006 | switch (index) { | 3006 | switch (index) { |
| 3007 | case 0: return instruction->target; | 3007 | case 0: return instruction->target; |
| 3008 | default: return nullptr; | 3008 | default: return nullptr; |
| 3009 | } | 3009 | } |
| 3010 | } | 3010 | } |
| 3011 | | 3011 | |
| 3012 | static IrInstruction *ir_instruction_enumtagtype_get_dep(IrInstructionEnumTagType *instruction, size_t index) { | 3012 | static IrInstruction *ir_instruction_enumtagtype_get_dep(IrInstructionTagType *instruction, size_t index) { |
| 3013 | switch (index) { | 3013 | switch (index) { |
| 3014 | case 0: return instruction->target; | 3014 | case 0: return instruction->target; |
| 3015 | default: return nullptr; | 3015 | default: return nullptr; |
| ... | @@ -3270,10 +3270,10 @@ static IrInstruction *ir_instruction_get_dep(IrInstruction *instruction, size_t | ... | @@ -3270,10 +3270,10 @@ static IrInstruction *ir_instruction_get_dep(IrInstruction *instruction, size_t |
| 3270 | return ir_instruction_declref_get_dep((IrInstructionDeclRef *) instruction, index); | 3270 | return ir_instruction_declref_get_dep((IrInstructionDeclRef *) instruction, index); |
| 3271 | case IrInstructionIdPanic: | 3271 | case IrInstructionIdPanic: |
| 3272 | return ir_instruction_panic_get_dep((IrInstructionPanic *) instruction, index); | 3272 | return ir_instruction_panic_get_dep((IrInstructionPanic *) instruction, index); |
| 3273 | case IrInstructionIdEnumTagName: | 3273 | case IrInstructionIdTagName: |
| 3274 | return ir_instruction_enumtagname_get_dep((IrInstructionEnumTagName *) instruction, index); | 3274 | return ir_instruction_enumtagname_get_dep((IrInstructionTagName *) instruction, index); |
| 3275 | case IrInstructionIdEnumTagType: | 3275 | case IrInstructionIdTagType: |
| 3276 | return ir_instruction_enumtagtype_get_dep((IrInstructionEnumTagType *) instruction, index); | 3276 | return ir_instruction_enumtagtype_get_dep((IrInstructionTagType *) instruction, index); |
| 3277 | case IrInstructionIdFieldParentPtr: | 3277 | case IrInstructionIdFieldParentPtr: |
| 3278 | return ir_instruction_fieldparentptr_get_dep((IrInstructionFieldParentPtr *) instruction, index); | 3278 | return ir_instruction_fieldparentptr_get_dep((IrInstructionFieldParentPtr *) instruction, index); |
| 3279 | case IrInstructionIdOffsetOf: | 3279 | case IrInstructionIdOffsetOf: |
| ... | @@ -4627,16 +4627,16 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo | ... | @@ -4627,16 +4627,16 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo |
| 4627 | return arg0_value; | 4627 | return arg0_value; |
| 4628 | | 4628 | |
| 4629 | IrInstruction *actual_tag = ir_build_union_tag(irb, scope, node, arg0_value); | 4629 | IrInstruction *actual_tag = ir_build_union_tag(irb, scope, node, arg0_value); |
| 4630 | return ir_build_enum_tag_name(irb, scope, node, actual_tag); | 4630 | return ir_build_tag_name(irb, scope, node, actual_tag); |
| 4631 | } | 4631 | } |
| 4632 | case BuiltinFnIdEnumTagType: | 4632 | case BuiltinFnIdTagType: |
| 4633 | { | 4633 | { |
| 4634 | AstNode *arg0_node = node->data.fn_call_expr.params.at(0); | 4634 | AstNode *arg0_node = node->data.fn_call_expr.params.at(0); |
| 4635 | IrInstruction *arg0_value = ir_gen_node(irb, arg0_node, scope); | 4635 | IrInstruction *arg0_value = ir_gen_node(irb, arg0_node, scope); |
| 4636 | if (arg0_value == irb->codegen->invalid_instruction) | 4636 | if (arg0_value == irb->codegen->invalid_instruction) |
| 4637 | return arg0_value; | 4637 | return arg0_value; |
| 4638 | | 4638 | |
| 4639 | return ir_build_enum_tag_type(irb, scope, node, arg0_value); | 4639 | return ir_build_tag_type(irb, scope, node, arg0_value); |
| 4640 | } | 4640 | } |
| 4641 | case BuiltinFnIdFieldParentPtr: | 4641 | case BuiltinFnIdFieldParentPtr: |
| 4642 | { | 4642 | { |
| ... | @@ -13638,7 +13638,7 @@ static TypeTableEntry *ir_analyze_instruction_err_name(IrAnalyze *ira, IrInstruc | ... | @@ -13638,7 +13638,7 @@ static TypeTableEntry *ir_analyze_instruction_err_name(IrAnalyze *ira, IrInstruc |
| 13638 | return str_type; | 13638 | return str_type; |
| 13639 | } | 13639 | } |
| 13640 | | 13640 | |
| 13641 | static TypeTableEntry *ir_analyze_instruction_enum_tag_name(IrAnalyze *ira, IrInstructionEnumTagName *instruction) { | 13641 | static TypeTableEntry *ir_analyze_instruction_enum_tag_name(IrAnalyze *ira, IrInstructionTagName *instruction) { |
| 13642 | IrInstruction *target = instruction->target->other; | 13642 | IrInstruction *target = instruction->target->other; |
| 13643 | if (type_is_invalid(target->value.type)) | 13643 | if (type_is_invalid(target->value.type)) |
| 13644 | return ira->codegen->builtin_types.entry_invalid; | 13644 | return ira->codegen->builtin_types.entry_invalid; |
| ... | @@ -13658,7 +13658,7 @@ static TypeTableEntry *ir_analyze_instruction_enum_tag_name(IrAnalyze *ira, IrIn | ... | @@ -13658,7 +13658,7 @@ static TypeTableEntry *ir_analyze_instruction_enum_tag_name(IrAnalyze *ira, IrIn |
| 13658 | ira->codegen->name_table_enums.append(target->value.type); | 13658 | ira->codegen->name_table_enums.append(target->value.type); |
| 13659 | } | 13659 | } |
| 13660 | | 13660 | |
| 13661 | IrInstruction *result = ir_build_enum_tag_name(&ira->new_irb, instruction->base.scope, | 13661 | IrInstruction *result = ir_build_tag_name(&ira->new_irb, instruction->base.scope, |
| 13662 | instruction->base.source_node, target); | 13662 | instruction->base.source_node, target); |
| 13663 | ir_link_new_instruction(result, &instruction->base); | 13663 | ir_link_new_instruction(result, &instruction->base); |
| 13664 | TypeTableEntry *u8_ptr_type = get_pointer_to_type(ira->codegen, ira->codegen->builtin_types.entry_u8, true); | 13664 | TypeTableEntry *u8_ptr_type = get_pointer_to_type(ira->codegen, ira->codegen->builtin_types.entry_u8, true); |
| ... | @@ -15838,22 +15838,43 @@ static TypeTableEntry *ir_analyze_instruction_arg_type(IrAnalyze *ira, IrInstruc | ... | @@ -15838,22 +15838,43 @@ static TypeTableEntry *ir_analyze_instruction_arg_type(IrAnalyze *ira, IrInstruc |
| 15838 | return ira->codegen->builtin_types.entry_type; | 15838 | return ira->codegen->builtin_types.entry_type; |
| 15839 | } | 15839 | } |
| 15840 | | 15840 | |
| 15841 | static TypeTableEntry *ir_analyze_instruction_enum_tag_type(IrAnalyze *ira, IrInstructionEnumTagType *instruction) { | 15841 | static TypeTableEntry *ir_analyze_instruction_tag_type(IrAnalyze *ira, IrInstructionTagType *instruction) { |
| 15842 | IrInstruction *target_inst = instruction->target->other; | 15842 | IrInstruction *target_inst = instruction->target->other; |
| 15843 | TypeTableEntry *enum_type = ir_resolve_type(ira, target_inst); | 15843 | TypeTableEntry *enum_type = ir_resolve_type(ira, target_inst); |
| 15844 | if (type_is_invalid(enum_type)) | 15844 | if (type_is_invalid(enum_type)) |
| 15845 | return ira->codegen->builtin_types.entry_invalid; | 15845 | return ira->codegen->builtin_types.entry_invalid; |
| 15846 | if (enum_type->id != TypeTableEntryIdEnum) { | 15846 | |
| 15847 | ir_add_error(ira, target_inst, buf_sprintf("expected enum, found '%s'", buf_ptr(&enum_type->name))); | 15847 | if (enum_type->id == TypeTableEntryIdEnum) { |
| | 15848 | ensure_complete_type(ira->codegen, enum_type); |
| | 15849 | if (type_is_invalid(enum_type)) |
| | 15850 | return ira->codegen->builtin_types.entry_invalid; |
| | 15851 | |
| | 15852 | ConstExprValue *out_val = ir_build_const_from(ira, &instruction->base); |
| | 15853 | out_val->data.x_type = enum_type->data.enumeration.tag_int_type; |
| | 15854 | return ira->codegen->builtin_types.entry_type; |
| | 15855 | } else if (enum_type->id == TypeTableEntryIdUnion) { |
| | 15856 | ensure_complete_type(ira->codegen, enum_type); |
| | 15857 | if (type_is_invalid(enum_type)) |
| | 15858 | return ira->codegen->builtin_types.entry_invalid; |
| | 15859 | |
| | 15860 | AstNode *decl_node = enum_type->data.unionation.decl_node; |
| | 15861 | if (decl_node->data.container_decl.auto_enum || decl_node->data.container_decl.init_arg_expr != nullptr) { |
| | 15862 | assert(enum_type->data.unionation.tag_type != nullptr); |
| | 15863 | |
| | 15864 | ConstExprValue *out_val = ir_build_const_from(ira, &instruction->base); |
| | 15865 | out_val->data.x_type = enum_type->data.unionation.tag_type; |
| | 15866 | return ira->codegen->builtin_types.entry_type; |
| | 15867 | } else { |
| | 15868 | ErrorMsg *msg = ir_add_error(ira, target_inst, buf_sprintf("union '%s' has no tag", |
| | 15869 | buf_ptr(&enum_type->name))); |
| | 15870 | add_error_note(ira->codegen, msg, decl_node, buf_sprintf("consider 'union(enum)' here")); |
| | 15871 | return ira->codegen->builtin_types.entry_invalid; |
| | 15872 | } |
| | 15873 | } else { |
| | 15874 | ir_add_error(ira, target_inst, buf_sprintf("expected enum or union, found '%s'", |
| | 15875 | buf_ptr(&enum_type->name))); |
| 15848 | return ira->codegen->builtin_types.entry_invalid; | 15876 | return ira->codegen->builtin_types.entry_invalid; |
| 15849 | } | 15877 | } |
| 15850 | ensure_complete_type(ira->codegen, enum_type); | | |
| 15851 | if (type_is_invalid(enum_type)) | | |
| 15852 | return ira->codegen->builtin_types.entry_invalid; | | |
| 15853 | | | |
| 15854 | ConstExprValue *out_val = ir_build_const_from(ira, &instruction->base); | | |
| 15855 | out_val->data.x_type = enum_type->data.enumeration.tag_int_type; | | |
| 15856 | return ira->codegen->builtin_types.entry_type; | | |
| 15857 | } | 15878 | } |
| 15858 | | 15879 | |
| 15859 | static TypeTableEntry *ir_analyze_instruction_nocast(IrAnalyze *ira, IrInstruction *instruction) { | 15880 | static TypeTableEntry *ir_analyze_instruction_nocast(IrAnalyze *ira, IrInstruction *instruction) { |
| ... | @@ -16032,8 +16053,8 @@ static TypeTableEntry *ir_analyze_instruction_nocast(IrAnalyze *ira, IrInstructi | ... | @@ -16032,8 +16053,8 @@ static TypeTableEntry *ir_analyze_instruction_nocast(IrAnalyze *ira, IrInstructi |
| 16032 | return ir_analyze_instruction_int_to_ptr(ira, (IrInstructionIntToPtr *)instruction); | 16053 | return ir_analyze_instruction_int_to_ptr(ira, (IrInstructionIntToPtr *)instruction); |
| 16033 | case IrInstructionIdPtrToInt: | 16054 | case IrInstructionIdPtrToInt: |
| 16034 | return ir_analyze_instruction_ptr_to_int(ira, (IrInstructionPtrToInt *)instruction); | 16055 | return ir_analyze_instruction_ptr_to_int(ira, (IrInstructionPtrToInt *)instruction); |
| 16035 | case IrInstructionIdEnumTagName: | 16056 | case IrInstructionIdTagName: |
| 16036 | return ir_analyze_instruction_enum_tag_name(ira, (IrInstructionEnumTagName *)instruction); | 16057 | return ir_analyze_instruction_enum_tag_name(ira, (IrInstructionTagName *)instruction); |
| 16037 | case IrInstructionIdFieldParentPtr: | 16058 | case IrInstructionIdFieldParentPtr: |
| 16038 | return ir_analyze_instruction_field_parent_ptr(ira, (IrInstructionFieldParentPtr *)instruction); | 16059 | return ir_analyze_instruction_field_parent_ptr(ira, (IrInstructionFieldParentPtr *)instruction); |
| 16039 | case IrInstructionIdOffsetOf: | 16060 | case IrInstructionIdOffsetOf: |
| ... | @@ -16052,8 +16073,8 @@ static TypeTableEntry *ir_analyze_instruction_nocast(IrAnalyze *ira, IrInstructi | ... | @@ -16052,8 +16073,8 @@ static TypeTableEntry *ir_analyze_instruction_nocast(IrAnalyze *ira, IrInstructi |
| 16052 | return ir_analyze_instruction_set_align_stack(ira, (IrInstructionSetAlignStack *)instruction); | 16073 | return ir_analyze_instruction_set_align_stack(ira, (IrInstructionSetAlignStack *)instruction); |
| 16053 | case IrInstructionIdArgType: | 16074 | case IrInstructionIdArgType: |
| 16054 | return ir_analyze_instruction_arg_type(ira, (IrInstructionArgType *)instruction); | 16075 | return ir_analyze_instruction_arg_type(ira, (IrInstructionArgType *)instruction); |
| 16055 | case IrInstructionIdEnumTagType: | 16076 | case IrInstructionIdTagType: |
| 16056 | return ir_analyze_instruction_enum_tag_type(ira, (IrInstructionEnumTagType *)instruction); | 16077 | return ir_analyze_instruction_tag_type(ira, (IrInstructionTagType *)instruction); |
| 16057 | } | 16078 | } |
| 16058 | zig_unreachable(); | 16079 | zig_unreachable(); |
| 16059 | } | 16080 | } |
| ... | @@ -16230,14 +16251,14 @@ bool ir_has_side_effects(IrInstruction *instruction) { | ... | @@ -16230,14 +16251,14 @@ bool ir_has_side_effects(IrInstruction *instruction) { |
| 16230 | case IrInstructionIdDeclRef: | 16251 | case IrInstructionIdDeclRef: |
| 16231 | case IrInstructionIdErrName: | 16252 | case IrInstructionIdErrName: |
| 16232 | case IrInstructionIdTypeName: | 16253 | case IrInstructionIdTypeName: |
| 16233 | case IrInstructionIdEnumTagName: | 16254 | case IrInstructionIdTagName: |
| 16234 | case IrInstructionIdFieldParentPtr: | 16255 | case IrInstructionIdFieldParentPtr: |
| 16235 | case IrInstructionIdOffsetOf: | 16256 | case IrInstructionIdOffsetOf: |
| 16236 | case IrInstructionIdTypeId: | 16257 | case IrInstructionIdTypeId: |
| 16237 | case IrInstructionIdAlignCast: | 16258 | case IrInstructionIdAlignCast: |
| 16238 | case IrInstructionIdOpaqueType: | 16259 | case IrInstructionIdOpaqueType: |
| 16239 | case IrInstructionIdArgType: | 16260 | case IrInstructionIdArgType: |
| 16240 | case IrInstructionIdEnumTagType: | 16261 | case IrInstructionIdTagType: |
| 16241 | return false; | 16262 | return false; |
| 16242 | case IrInstructionIdAsm: | 16263 | case IrInstructionIdAsm: |
| 16243 | { | 16264 | { |