authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-11-25 02:40:06+02:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-11-26 18:05:27+02:00
log587ef60a28ae7c1c780e02ecf60b331ead53bc7f
treeb9a13a178108717bc40a5bb042beb79f95bf2a91
parentbf62cb453bb1e91cd0ed448de70bd4f076b81906

Sema: resolve union fields before using getTagType

Closes #13649

2 files changed, 20 insertions(+), 2 deletions(-)

src/Sema.zig+4-2
...@@ -7580,7 +7580,8 @@ fn zirEnumToInt(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!A...@@ -7580,7 +7580,8 @@ fn zirEnumToInt(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!A
7580 const enum_tag: Air.Inst.Ref = switch (operand_ty.zigTypeTag()) {7580 const enum_tag: Air.Inst.Ref = switch (operand_ty.zigTypeTag()) {
7581 .Enum => operand,7581 .Enum => operand,
7582 .Union => blk: {7582 .Union => blk: {
7583 const tag_ty = operand_ty.unionTagType() orelse {7583 const union_ty = try sema.resolveTypeFields(operand_ty);
7584 const tag_ty = union_ty.unionTagType() orelse {
7584 return sema.fail(7585 return sema.fail(
7585 block,7586 block,
7586 operand_src,7587 operand_src,
...@@ -22713,7 +22714,8 @@ fn fieldPtr(...@@ -22713,7 +22714,8 @@ fn fieldPtr(
22713 return inst;22714 return inst;
22714 }22715 }
22715 }22716 }
22716 if (child_type.unionTagType()) |enum_ty| {22717 const union_ty = try sema.resolveTypeFields(child_type);
22718 if (union_ty.unionTagType()) |enum_ty| {
22717 if (enum_ty.enumFieldIndex(field_name)) |field_index| {22719 if (enum_ty.enumFieldIndex(field_name)) |field_index| {
22718 const field_index_u32 = @intCast(u32, field_index);22720 const field_index_u32 = @intCast(u32, field_index);
22719 var anon_decl = try block.startAnonDecl();22721 var anon_decl = try block.startAnonDecl();
test/cases/compile_errors/union_fields_are_resolved_before_tag_type_is_needed.zig created+16
...@@ -0,0 +1,16 @@
1const T = union(enum) {
2 a,
3 pub fn f(self: T) void {
4 _ = self;
5 }
6};
7pub export fn entry() void {
8 T.a.f();
9}
10
11// error
12// backend=stage2
13// target=native
14//
15// :8:8: error: no field or member function named 'f' in '@typeInfo(tmp.T).Union.tag_type.?'
16// :1:11: note: enum declared here