aboutsummaryrefslogtreecommitdiff
path: root/src/Module.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2022-03-16 13:31:53 -0700
committerAndrew Kelley <andrew@ziglang.org>2022-03-16 13:31:53 -0700
commit94672dfb1941289eb65fdeab2e1dcc39ca70c3b7 (patch)
treea28abab9a820840a1cbe8ebdaffa301020e5765e /src/Module.zig
parent92a09eb1e4d5914e5ea81c55c5feb322fcd90e7b (diff)
downloadzig-94672dfb1941289eb65fdeab2e1dcc39ca70c3b7.tar.gz
zig-94672dfb1941289eb65fdeab2e1dcc39ca70c3b7.zip
stage2: fully resolve fn types after analyzing its body
Diffstat (limited to 'src/Module.zig')
-rw-r--r--src/Module.zig17
1 files changed, 15 insertions, 2 deletions
diff --git a/src/Module.zig b/src/Module.zig
index 20bf25af03..6dfc5f3528 100644
--- a/src/Module.zig
+++ b/src/Module.zig
@@ -4739,7 +4739,8 @@ pub fn analyzeFnBody(mod: *Module, decl: *Decl, func: *Fn, arena: Allocator) Sem
// map the comptime parameters to constant values and only emit arg AIR instructions
// for the runtime ones.
const fn_ty = decl.ty;
- const runtime_params_len = @intCast(u32, fn_ty.fnParamLen());
+ const fn_ty_info = fn_ty.fnInfo();
+ const runtime_params_len = @intCast(u32, fn_ty_info.param_types.len);
try inner_block.instructions.ensureTotalCapacityPrecise(gpa, runtime_params_len);
try sema.air_instructions.ensureUnusedCapacity(gpa, fn_info.total_params_len * 2); // * 2 for the `addType`
try sema.inst_map.ensureUnusedCapacity(gpa, fn_info.total_params_len);
@@ -4771,7 +4772,7 @@ pub fn analyzeFnBody(mod: *Module, decl: *Decl, func: *Fn, arena: Allocator) Sem
continue;
}
}
- const param_type = fn_ty.fnParamType(runtime_param_index);
+ const param_type = fn_ty_info.param_types[runtime_param_index];
const opt_opv = sema.typeHasOnePossibleValue(&inner_block, param.src, param_type) catch |err| switch (err) {
error.NeededSourceLocation => unreachable,
error.GenericPoison => unreachable,
@@ -4822,6 +4823,18 @@ pub fn analyzeFnBody(mod: *Module, decl: *Decl, func: *Fn, arena: Allocator) Sem
func.state = .success;
log.debug("set {s} to success", .{decl.name});
+ // Finally we must resolve the return type and parameter types so that backends
+ // have full access to type information.
+ const src: LazySrcLoc = .{ .node_offset = 0 };
+ sema.resolveFnTypes(&inner_block, src, fn_ty_info) catch |err| switch (err) {
+ error.NeededSourceLocation => unreachable,
+ error.GenericPoison => unreachable,
+ error.ComptimeReturn => unreachable,
+ error.ComptimeBreak => unreachable,
+ error.AnalysisFail => {},
+ else => |e| return e,
+ };
+
return Air{
.instructions = sema.air_instructions.toOwnedSlice(),
.extra = sema.air_extra.toOwnedSlice(gpa),