Commit 5d28d171df

Veikka Tuominen <git@vexu.eu>
2022-11-05 11:51:32
Sema: adjust result type of anyerror field access
Closes #13448
1 parent ea48f06
Changed files (2)
src
test
behavior
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});
+}