diff --git a/src/Sema.zig b/src/Sema.zig index e453d0d9e0..d9f514a6e7 100644 --- 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 index 2013cbcfa3..25feb101bc 100644 --- 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}); +}