zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit 587ef60a28ae7c1c780e02ecf60b331ead53bc7f (tree)
parent bf62cb453bb1e91cd0ed448de70bd4f076b81906
Author: Veikka Tuominen <git@vexu.eu>
Date:   Fri, 25 Nov 2022 02:40:06 +0200

Sema: resolve union fields before using getTagType

Closes #13649

Diffstat:
Msrc/Sema.zig | 6++++--
Atest/cases/compile_errors/union_fields_are_resolved_before_tag_type_is_needed.zig | 16++++++++++++++++
2 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/src/Sema.zig b/src/Sema.zig @@ -7580,7 +7580,8 @@ fn zirEnumToInt(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!A const enum_tag: Air.Inst.Ref = switch (operand_ty.zigTypeTag()) { .Enum => operand, .Union => blk: { - const tag_ty = operand_ty.unionTagType() orelse { + const union_ty = try sema.resolveTypeFields(operand_ty); + const tag_ty = union_ty.unionTagType() orelse { return sema.fail( block, operand_src, @@ -22713,7 +22714,8 @@ fn fieldPtr( return inst; } } - if (child_type.unionTagType()) |enum_ty| { + const union_ty = try sema.resolveTypeFields(child_type); + if (union_ty.unionTagType()) |enum_ty| { if (enum_ty.enumFieldIndex(field_name)) |field_index| { const field_index_u32 = @intCast(u32, field_index); var anon_decl = try block.startAnonDecl(); diff --git a/test/cases/compile_errors/union_fields_are_resolved_before_tag_type_is_needed.zig b/test/cases/compile_errors/union_fields_are_resolved_before_tag_type_is_needed.zig @@ -0,0 +1,16 @@ +const T = union(enum) { + a, + pub fn f(self: T) void { + _ = self; + } +}; +pub export fn entry() void { + T.a.f(); +} + +// error +// backend=stage2 +// target=native +// +// :8:8: error: no field or member function named 'f' in '@typeInfo(tmp.T).Union.tag_type.?' +// :1:11: note: enum declared here