diff --git a/src/Sema.zig b/src/Sema.zig index f8c77c7c05..2521bddce0 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -31523,6 +31523,16 @@ fn resolveInferredErrorSet( if (ies_func_info.return_type.tag() == .generic_poison) { assert(ies_func_info.cc == .Inline); } else if (ies_func_info.return_type.errorUnionSet().castTag(.error_set_inferred).?.data == ies) { + if (ies_func_info.is_generic) { + const msg = msg: { + const msg = try sema.errMsg(block, src, "unable to resolve inferred error set of generic function", .{}); + errdefer msg.destroy(sema.gpa); + + try sema.mod.errNoteNonLazy(ies_func_owner_decl.srcLoc(), msg, "generic function declared here", .{}); + break :msg msg; + }; + return sema.failWithOwnedErrorMsg(msg); + } // In this case we are dealing with the actual InferredErrorSet object that // corresponds to the function, not one created to track an inline/comptime call. try sema.ensureFuncBodyAnalyzed(ies.func); diff --git a/test/cases/compile_errors/resolve_inferred_error_set_of_generic_fn.zig b/test/cases/compile_errors/resolve_inferred_error_set_of_generic_fn.zig new file mode 100644 index 0000000000..587ff7a878 --- /dev/null +++ b/test/cases/compile_errors/resolve_inferred_error_set_of_generic_fn.zig @@ -0,0 +1,18 @@ +fn foo(a: anytype) !void { + if (a == 0) return error.A; + return error.B; +} +const Error = error{ A, B }; +export fn entry() void { + const info = @typeInfo(@TypeOf(foo)); + const ret_type = info.Fn.return_type.?; + const error_set = @typeInfo(ret_type).ErrorUnion.error_set; + _ = Error || error_set; +} + +// error +// backend=stage2 +// target=native +// +// :10:15: error: unable to resolve inferred error set of generic function +// :1:1: note: generic function declared here