Commit 5d28d171df
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
));
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});
+}