diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2022-03-16 13:31:53 -0700 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2022-03-16 13:31:53 -0700 |
| commit | 94672dfb1941289eb65fdeab2e1dcc39ca70c3b7 (patch) | |
| tree | a28abab9a820840a1cbe8ebdaffa301020e5765e /src/Module.zig | |
| parent | 92a09eb1e4d5914e5ea81c55c5feb322fcd90e7b (diff) | |
| download | zig-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.zig | 17 |
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), |
