aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2023-07-18 21:15:16 -0700
committerAndrew Kelley <andrew@ziglang.org>2023-07-18 21:15:16 -0700
commitc597ba32d930df0c2d5be846f3b14a19a5c440c5 (patch)
treee3d8ade8a28a9b3d9366bbf3471cc590b385224a /src
parent3145ae561dadc22105997483fe2330fb96a5c8dd (diff)
downloadzig-c597ba32d930df0c2d5be846f3b14a19a5c440c5.tar.gz
zig-c597ba32d930df0c2d5be846f3b14a19a5c440c5.zip
Sema: fix return type of generic function is function pointer
also that's one less standalone test and one more behavior test.
Diffstat (limited to 'src')
-rw-r--r--src/Sema.zig16
1 files changed, 15 insertions, 1 deletions
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;