Sema: adjust result type of anyerror field access

Closes #13448
This commit is contained in:
Veikka Tuominen 2022-11-05 12:51:32 +02:00
parent ea48f06fc2
commit 5d28d171df
2 changed files with 18 additions and 2 deletions

View File

@ -22475,7 +22475,10 @@ fn fieldVal(
} else (try sema.mod.getErrorValue(field_name)).key;
return sema.addConstant(
try child_type.copy(arena),
if (!child_type.isAnyError())
try child_type.copy(arena)
else
try Type.Tag.error_set_single.create(arena, name),
try Value.Tag.@"error".create(arena, .{ .name = name }),
);
},
@ -22686,7 +22689,10 @@ fn fieldPtr(
var anon_decl = try block.startAnonDecl(src);
defer anon_decl.deinit();
return sema.analyzeDeclRef(try anon_decl.finish(
try child_type.copy(anon_decl.arena()),
if (!child_type.isAnyError())
try child_type.copy(anon_decl.arena())
else
try Type.Tag.error_set_single.create(anon_decl.arena(), name),
try Value.Tag.@"error".create(anon_decl.arena(), .{ .name = name }),
0, // default alignment
));

View File

@ -855,3 +855,13 @@ test "error from comptime string" {
try expect(mem.eql(u8, name, @errorName(err)));
}
}
test "field access of anyerror results in smaller error set" {
if (builtin.zig_backend == .stage1) return error.SkipZigTest;
const E1 = @TypeOf(error.Foo);
try expect(@TypeOf(E1.Foo) == E1);
const E2 = error{ A, B, C };
try expect(@TypeOf(E2.A) == E2);
try expect(@TypeOf(@field(anyerror, "NotFound")) == error{NotFound});
}