| author | |
| committer | |
| log | c597ba32d930df0c2d5be846f3b14a19a5c440c5 |
| tree | e3d8ade8a28a9b3d9366bbf3471cc590b385224a |
| parent | 3145ae561dadc22105997483fe2330fb96a5c8dd |
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 | 8550 | const err = err: { |
| 8551 | 8551 | // Make sure any nested param instructions don't clobber our work. |
| 8552 | 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 | 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 | } | |
| 8555 | 8569 | |
| 8556 | 8570 | const uncasted = sema.resolveBody(block, body, func_inst) catch |err| break :err err; |
| 8557 | 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 | 443 | }; |
| 444 | 444 | try S.doMath(std.math.add, 5, 6); |
| 445 | 445 | } |
| 446 | ||
| 447 | test "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 | 213 | // .build_root = "test/standalone/sigpipe", |
| 214 | 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 | 216 | // TODO restore this test |
| 221 | 217 | //.{ |
| 222 | 218 | // .build_root = "test/standalone/options", |
test/standalone/issue_13030/build.zig deleted-24| ... | ... | @@ -1,24 +0,0 @@ |
| 1 | const std = @import("std"); | |
| 2 | const builtin = @import("builtin"); | |
| 3 | const CrossTarget = std.zig.CrossTarget; | |
| 4 | ||
| 5 | pub 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 | ||
| 15 | fn 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 @@ |
| 1 | fn b(comptime T: type) ?*const fn () error{}!T { | |
| 2 | return null; | |
| 3 | } | |
| 4 | ||
| 5 | export fn entry() void { | |
| 6 | _ = b(void); | |
| 7 | } |