diff --git a/src/Sema.zig b/src/Sema.zig index afc0cc5988..a88b29cd10 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -8550,8 +8550,22 @@ fn resolveGenericBody( const err = err: { // Make sure any nested param instructions don't clobber our work. const prev_params = block.params; + const prev_no_partial_func_type = sema.no_partial_func_ty; + const prev_generic_owner = sema.generic_owner; + const prev_generic_call_src = sema.generic_call_src; + const prev_generic_call_decl = sema.generic_call_decl; block.params = .{}; - defer block.params = prev_params; + sema.no_partial_func_ty = true; + sema.generic_owner = .none; + sema.generic_call_src = .unneeded; + sema.generic_call_decl = .none; + defer { + block.params = prev_params; + sema.no_partial_func_ty = prev_no_partial_func_type; + sema.generic_owner = prev_generic_owner; + sema.generic_call_src = prev_generic_call_src; + sema.generic_call_decl = prev_generic_call_decl; + } const uncasted = sema.resolveBody(block, body, func_inst) catch |err| break :err err; const result = sema.coerce(block, dest_ty, uncasted, src) catch |err| break :err err; diff --git a/test/behavior/generics.zig b/test/behavior/generics.zig index 7d4a841a62..a8a7d3c0ed 100644 --- a/test/behavior/generics.zig +++ b/test/behavior/generics.zig @@ -443,3 +443,16 @@ test "generic function passed as comptime argument" { }; try S.doMath(std.math.add, 5, 6); } + +test "return type of generic function is function pointer" { + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; + + const S = struct { + fn b(comptime T: type) ?*const fn () error{}!T { + return null; + } + }; + + try expect(null == S.b(void)); +} diff --git a/test/standalone.zig b/test/standalone.zig index d812669664..cfdb09ea07 100644 --- a/test/standalone.zig +++ b/test/standalone.zig @@ -213,10 +213,6 @@ pub const build_cases = [_]BuildCase{ // .build_root = "test/standalone/sigpipe", // .import = @import("standalone/sigpipe/build.zig"), //}, - .{ - .build_root = "test/standalone/issue_13030", - .import = @import("standalone/issue_13030/build.zig"), - }, // TODO restore this test //.{ // .build_root = "test/standalone/options", diff --git a/test/standalone/issue_13030/build.zig b/test/standalone/issue_13030/build.zig deleted file mode 100644 index e31863fee2..0000000000 --- a/test/standalone/issue_13030/build.zig +++ /dev/null @@ -1,24 +0,0 @@ -const std = @import("std"); -const builtin = @import("builtin"); -const CrossTarget = std.zig.CrossTarget; - -pub fn build(b: *std.Build) void { - const test_step = b.step("test", "Test it"); - b.default_step = test_step; - - add(b, test_step, .Debug); - add(b, test_step, .ReleaseFast); - add(b, test_step, .ReleaseSmall); - add(b, test_step, .ReleaseSafe); -} - -fn add(b: *std.Build, test_step: *std.Build.Step, optimize: std.builtin.OptimizeMode) void { - const obj = b.addObject(.{ - .name = "main", - .root_source_file = .{ .path = "main.zig" }, - .optimize = optimize, - .target = .{}, - }); - - test_step.dependOn(&obj.step); -} diff --git a/test/standalone/issue_13030/main.zig b/test/standalone/issue_13030/main.zig deleted file mode 100644 index 5e4c976db3..0000000000 --- a/test/standalone/issue_13030/main.zig +++ /dev/null @@ -1,7 +0,0 @@ -fn b(comptime T: type) ?*const fn () error{}!T { - return null; -} - -export fn entry() void { - _ = b(void); -}