zig

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

commit 5d28d171dffd5a03276e04ec7089593e967630df (tree)
parent ea48f06fc2965ff2e9516c23e58a50a9db5da84b
Author: Veikka Tuominen <git@vexu.eu>
Date:   Sat,  5 Nov 2022 12:51:32 +0200

Sema: adjust result type of anyerror field access

Closes #13448

Diffstat:
Msrc/Sema.zig | 10++++++++--
Mtest/behavior/error.zig | 10++++++++++
2 files changed, 18 insertions(+), 2 deletions(-)

diff --git a/src/Sema.zig b/src/Sema.zig @@ -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 )); diff --git a/test/behavior/error.zig b/test/behavior/error.zig @@ -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}); +}