authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-07-18 21:15:16-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-07-18 21:15:16-07:00
logc597ba32d930df0c2d5be846f3b14a19a5c440c5
treee3d8ade8a28a9b3d9366bbf3471cc590b385224a
parent3145ae561dadc22105997483fe2330fb96a5c8dd

Sema: fix return type of generic function is function pointer

also that's one less standalone test and one more behavior test.

5 files changed, 28 insertions(+), 36 deletions(-)

src/Sema.zig+15-1
...@@ -8550,8 +8550,22 @@ fn resolveGenericBody(...@@ -8550,8 +8550,22 @@ fn resolveGenericBody(
8550 const err = err: {8550 const err = err: {
8551 // Make sure any nested param instructions don't clobber our work.8551 // Make sure any nested param instructions don't clobber our work.
8552 const prev_params = block.params;8552 const prev_params = block.params;
8553 const prev_no_partial_func_type = sema.no_partial_func_ty;
8554 const prev_generic_owner = sema.generic_owner;
8555 const prev_generic_call_src = sema.generic_call_src;
8556 const prev_generic_call_decl = sema.generic_call_decl;
8553 block.params = .{};8557 block.params = .{};
8554 defer block.params = prev_params;8558 sema.no_partial_func_ty = true;
8559 sema.generic_owner = .none;
8560 sema.generic_call_src = .unneeded;
8561 sema.generic_call_decl = .none;
8562 defer {
8563 block.params = prev_params;
8564 sema.no_partial_func_ty = prev_no_partial_func_type;
8565 sema.generic_owner = prev_generic_owner;
8566 sema.generic_call_src = prev_generic_call_src;
8567 sema.generic_call_decl = prev_generic_call_decl;
8568 }
85558569
8556 const uncasted = sema.resolveBody(block, body, func_inst) catch |err| break :err err;8570 const uncasted = sema.resolveBody(block, body, func_inst) catch |err| break :err err;
8557 const result = sema.coerce(block, dest_ty, uncasted, src) catch |err| break :err err;8571 const result = sema.coerce(block, dest_ty, uncasted, src) catch |err| break :err err;
test/behavior/generics.zig+13
...@@ -443,3 +443,16 @@ test "generic function passed as comptime argument" {...@@ -443,3 +443,16 @@ test "generic function passed as comptime argument" {
443 };443 };
444 try S.doMath(std.math.add, 5, 6);444 try S.doMath(std.math.add, 5, 6);
445}445}
446
447test "return type of generic function is function pointer" {
448 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
449 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
450
451 const S = struct {
452 fn b(comptime T: type) ?*const fn () error{}!T {
453 return null;
454 }
455 };
456
457 try expect(null == S.b(void));
458}
test/standalone.zig-4
...@@ -213,10 +213,6 @@ pub const build_cases = [_]BuildCase{...@@ -213,10 +213,6 @@ pub const build_cases = [_]BuildCase{
213 // .build_root = "test/standalone/sigpipe",213 // .build_root = "test/standalone/sigpipe",
214 // .import = @import("standalone/sigpipe/build.zig"),214 // .import = @import("standalone/sigpipe/build.zig"),
215 //},215 //},
216 .{
217 .build_root = "test/standalone/issue_13030",
218 .import = @import("standalone/issue_13030/build.zig"),
219 },
220 // TODO restore this test216 // TODO restore this test
221 //.{217 //.{
222 // .build_root = "test/standalone/options",218 // .build_root = "test/standalone/options",
test/standalone/issue_13030/build.zig deleted-24
...@@ -1,24 +0,0 @@
1const std = @import("std");
2const builtin = @import("builtin");
3const CrossTarget = std.zig.CrossTarget;
4
5pub fn build(b: *std.Build) void {
6 const test_step = b.step("test", "Test it");
7 b.default_step = test_step;
8
9 add(b, test_step, .Debug);
10 add(b, test_step, .ReleaseFast);
11 add(b, test_step, .ReleaseSmall);
12 add(b, test_step, .ReleaseSafe);
13}
14
15fn add(b: *std.Build, test_step: *std.Build.Step, optimize: std.builtin.OptimizeMode) void {
16 const obj = b.addObject(.{
17 .name = "main",
18 .root_source_file = .{ .path = "main.zig" },
19 .optimize = optimize,
20 .target = .{},
21 });
22
23 test_step.dependOn(&obj.step);
24}
test/standalone/issue_13030/main.zig deleted-7
...@@ -1,7 +0,0 @@
1fn b(comptime T: type) ?*const fn () error{}!T {
2 return null;
3}
4
5export fn entry() void {
6 _ = b(void);
7}