authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-11-05 12:51:32+02:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-11-05 13:22:21+02:00
log5d28d171dffd5a03276e04ec7089593e967630df
treebb2bc9117040ccc00c212ec42cff4a436311c935
parentea48f06fc2965ff2e9516c23e58a50a9db5da84b

Sema: adjust result type of anyerror field access

Closes #13448

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

src/Sema.zig+8-2
...@@ -22475,7 +22475,10 @@ fn fieldVal(...@@ -22475,7 +22475,10 @@ fn fieldVal(
22475 } else (try sema.mod.getErrorValue(field_name)).key;22475 } else (try sema.mod.getErrorValue(field_name)).key;
2247622476
22477 return sema.addConstant(22477 return sema.addConstant(
22478 try child_type.copy(arena),22478 if (!child_type.isAnyError())
22479 try child_type.copy(arena)
22480 else
22481 try Type.Tag.error_set_single.create(arena, name),
22479 try Value.Tag.@"error".create(arena, .{ .name = name }),22482 try Value.Tag.@"error".create(arena, .{ .name = name }),
22480 );22483 );
22481 },22484 },
...@@ -22686,7 +22689,10 @@ fn fieldPtr(...@@ -22686,7 +22689,10 @@ fn fieldPtr(
22686 var anon_decl = try block.startAnonDecl(src);22689 var anon_decl = try block.startAnonDecl(src);
22687 defer anon_decl.deinit();22690 defer anon_decl.deinit();
22688 return sema.analyzeDeclRef(try anon_decl.finish(22691 return sema.analyzeDeclRef(try anon_decl.finish(
22689 try child_type.copy(anon_decl.arena()),22692 if (!child_type.isAnyError())
22693 try child_type.copy(anon_decl.arena())
22694 else
22695 try Type.Tag.error_set_single.create(anon_decl.arena(), name),
22690 try Value.Tag.@"error".create(anon_decl.arena(), .{ .name = name }),22696 try Value.Tag.@"error".create(anon_decl.arena(), .{ .name = name }),
22691 0, // default alignment22697 0, // default alignment
22692 ));22698 ));
test/behavior/error.zig+10
...@@ -855,3 +855,13 @@ test "error from comptime string" {...@@ -855,3 +855,13 @@ test "error from comptime string" {
855 try expect(mem.eql(u8, name, @errorName(err)));855 try expect(mem.eql(u8, name, @errorName(err)));
856 }856 }
857}857}
858
859test "field access of anyerror results in smaller error set" {
860 if (builtin.zig_backend == .stage1) return error.SkipZigTest;
861
862 const E1 = @TypeOf(error.Foo);
863 try expect(@TypeOf(E1.Foo) == E1);
864 const E2 = error{ A, B, C };
865 try expect(@TypeOf(E2.A) == E2);
866 try expect(@TypeOf(@field(anyerror, "NotFound")) == error{NotFound});
867}