| ... | ... | @@ -539,12 +539,12 @@ static constexpr IrInstructionId ir_instruction_id(IrInstructionPanic *) { |
| 539 | 539 | return IrInstructionIdPanic; |
| 540 | 540 | } |
| 541 | 541 | |
| 542 | | static constexpr IrInstructionId ir_instruction_id(IrInstructionEnumTagName *) { |
| 543 | | return IrInstructionIdEnumTagName; |
| 542 | static constexpr IrInstructionId ir_instruction_id(IrInstructionTagName *) { |
| 543 | return IrInstructionIdTagName; |
| 544 | 544 | } |
| 545 | 545 | |
| 546 | | static constexpr IrInstructionId ir_instruction_id(IrInstructionEnumTagType *) { |
| 547 | | return IrInstructionIdEnumTagType; |
| 546 | static constexpr IrInstructionId ir_instruction_id(IrInstructionTagType *) { |
| 547 | return IrInstructionIdTagType; |
| 548 | 548 | } |
| 549 | 549 | |
| 550 | 550 | static constexpr IrInstructionId ir_instruction_id(IrInstructionFieldParentPtr *) { |
| ... | ... | @@ -2205,10 +2205,10 @@ static IrInstruction *ir_build_panic(IrBuilder *irb, Scope *scope, AstNode *sour |
| 2205 | 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 | 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 | 2212 | instruction->target = target; |
| 2213 | 2213 | |
| 2214 | 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 | 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 | 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 | 2223 | instruction->target = target; |
| 2224 | 2224 | |
| 2225 | 2225 | ir_ref_instruction(target, irb->current_basic_block); |
| ... | ... | @@ -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 | 3006 | switch (index) { |
| 3007 | 3007 | case 0: return instruction->target; |
| 3008 | 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 | 3013 | switch (index) { |
| 3014 | 3014 | case 0: return instruction->target; |
| 3015 | 3015 | default: return nullptr; |
| ... | ... | @@ -3270,10 +3270,10 @@ static IrInstruction *ir_instruction_get_dep(IrInstruction *instruction, size_t |
| 3270 | 3270 | return ir_instruction_declref_get_dep((IrInstructionDeclRef *) instruction, index); |
| 3271 | 3271 | case IrInstructionIdPanic: |
| 3272 | 3272 | return ir_instruction_panic_get_dep((IrInstructionPanic *) instruction, index); |
| 3273 | | case IrInstructionIdEnumTagName: |
| 3274 | | return ir_instruction_enumtagname_get_dep((IrInstructionEnumTagName *) instruction, index); |
| 3275 | | case IrInstructionIdEnumTagType: |
| 3276 | | return ir_instruction_enumtagtype_get_dep((IrInstructionEnumTagType *) instruction, index); |
| 3273 | case IrInstructionIdTagName: |
| 3274 | return ir_instruction_enumtagname_get_dep((IrInstructionTagName *) instruction, index); |
| 3275 | case IrInstructionIdTagType: |
| 3276 | return ir_instruction_enumtagtype_get_dep((IrInstructionTagType *) instruction, index); |
| 3277 | 3277 | case IrInstructionIdFieldParentPtr: |
| 3278 | 3278 | return ir_instruction_fieldparentptr_get_dep((IrInstructionFieldParentPtr *) instruction, index); |
| 3279 | 3279 | case IrInstructionIdOffsetOf: |
| ... | ... | @@ -4627,16 +4627,16 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo |
| 4627 | 4627 | return arg0_value; |
| 4628 | 4628 | |
| 4629 | 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 | 4634 | AstNode *arg0_node = node->data.fn_call_expr.params.at(0); |
| 4635 | 4635 | IrInstruction *arg0_value = ir_gen_node(irb, arg0_node, scope); |
| 4636 | 4636 | if (arg0_value == irb->codegen->invalid_instruction) |
| 4637 | 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 | 4641 | case BuiltinFnIdFieldParentPtr: |
| 4642 | 4642 | { |
| ... | ... | @@ -13638,7 +13638,7 @@ static TypeTableEntry *ir_analyze_instruction_err_name(IrAnalyze *ira, IrInstruc |
| 13638 | 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 | 13642 | IrInstruction *target = instruction->target->other; |
| 13643 | 13643 | if (type_is_invalid(target->value.type)) |
| 13644 | 13644 | return ira->codegen->builtin_types.entry_invalid; |
| ... | ... | @@ -13658,7 +13658,7 @@ static TypeTableEntry *ir_analyze_instruction_enum_tag_name(IrAnalyze *ira, IrIn |
| 13658 | 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 | 13662 | instruction->base.source_node, target); |
| 13663 | 13663 | ir_link_new_instruction(result, &instruction->base); |
| 13664 | 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 | 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 | 15842 | IrInstruction *target_inst = instruction->target->other; |
| 15843 | 15843 | TypeTableEntry *enum_type = ir_resolve_type(ira, target_inst); |
| 15844 | 15844 | if (type_is_invalid(enum_type)) |
| 15845 | 15845 | return ira->codegen->builtin_types.entry_invalid; |
| 15846 | | if (enum_type->id != TypeTableEntryIdEnum) { |
| 15847 | | ir_add_error(ira, target_inst, buf_sprintf("expected enum, found '%s'", buf_ptr(&enum_type->name))); |
| 15846 | |
| 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 | 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 | 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 | 16053 | return ir_analyze_instruction_int_to_ptr(ira, (IrInstructionIntToPtr *)instruction); |
| 16033 | 16054 | case IrInstructionIdPtrToInt: |
| 16034 | 16055 | return ir_analyze_instruction_ptr_to_int(ira, (IrInstructionPtrToInt *)instruction); |
| 16035 | | case IrInstructionIdEnumTagName: |
| 16036 | | return ir_analyze_instruction_enum_tag_name(ira, (IrInstructionEnumTagName *)instruction); |
| 16056 | case IrInstructionIdTagName: |
| 16057 | return ir_analyze_instruction_enum_tag_name(ira, (IrInstructionTagName *)instruction); |
| 16037 | 16058 | case IrInstructionIdFieldParentPtr: |
| 16038 | 16059 | return ir_analyze_instruction_field_parent_ptr(ira, (IrInstructionFieldParentPtr *)instruction); |
| 16039 | 16060 | case IrInstructionIdOffsetOf: |
| ... | ... | @@ -16052,8 +16073,8 @@ static TypeTableEntry *ir_analyze_instruction_nocast(IrAnalyze *ira, IrInstructi |
| 16052 | 16073 | return ir_analyze_instruction_set_align_stack(ira, (IrInstructionSetAlignStack *)instruction); |
| 16053 | 16074 | case IrInstructionIdArgType: |
| 16054 | 16075 | return ir_analyze_instruction_arg_type(ira, (IrInstructionArgType *)instruction); |
| 16055 | | case IrInstructionIdEnumTagType: |
| 16056 | | return ir_analyze_instruction_enum_tag_type(ira, (IrInstructionEnumTagType *)instruction); |
| 16076 | case IrInstructionIdTagType: |
| 16077 | return ir_analyze_instruction_tag_type(ira, (IrInstructionTagType *)instruction); |
| 16057 | 16078 | } |
| 16058 | 16079 | zig_unreachable(); |
| 16059 | 16080 | } |
| ... | ... | @@ -16230,14 +16251,14 @@ bool ir_has_side_effects(IrInstruction *instruction) { |
| 16230 | 16251 | case IrInstructionIdDeclRef: |
| 16231 | 16252 | case IrInstructionIdErrName: |
| 16232 | 16253 | case IrInstructionIdTypeName: |
| 16233 | | case IrInstructionIdEnumTagName: |
| 16254 | case IrInstructionIdTagName: |
| 16234 | 16255 | case IrInstructionIdFieldParentPtr: |
| 16235 | 16256 | case IrInstructionIdOffsetOf: |
| 16236 | 16257 | case IrInstructionIdTypeId: |
| 16237 | 16258 | case IrInstructionIdAlignCast: |
| 16238 | 16259 | case IrInstructionIdOpaqueType: |
| 16239 | 16260 | case IrInstructionIdArgType: |
| 16240 | | case IrInstructionIdEnumTagType: |
| 16261 | case IrInstructionIdTagType: |
| 16241 | 16262 | return false; |
| 16242 | 16263 | case IrInstructionIdAsm: |
| 16243 | 16264 | { |