aboutsummaryrefslogtreecommitdiff
path: root/src/Sema.zig
diff options
context:
space:
mode:
authorJacob Young <jacobly0@users.noreply.github.com>2023-08-09 09:26:16 -0400
committerJacob Young <jacobly0@users.noreply.github.com>2023-08-09 10:09:01 -0400
commit736df276632ad66294a7491a5e35a039dd2c836f (patch)
tree3f81ef72acd1d2ac6ea722c9dbfaafe1d06bb1b2 /src/Sema.zig
parent9630379a8ec593adc65880e814e4c7161b6d5775 (diff)
downloadzig-736df276632ad66294a7491a5e35a039dd2c836f.tar.gz
zig-736df276632ad66294a7491a5e35a039dd2c836f.zip
Sema: use the correct decl for generic argument source locations
Closes #16746
Diffstat (limited to 'src/Sema.zig')
-rw-r--r--src/Sema.zig37
1 files changed, 18 insertions, 19 deletions
diff --git a/src/Sema.zig b/src/Sema.zig
index 973cc35be2..ac9886fa62 100644
--- a/src/Sema.zig
+++ b/src/Sema.zig
@@ -9219,6 +9219,21 @@ fn finishFunc(
return Air.internedToRef(if (opt_func_index != .none) opt_func_index else func_ty);
}
+fn genericArgSrcLoc(sema: *Sema, block: *Block, param_index: u32, param_src: LazySrcLoc) Module.SrcLoc {
+ const mod = sema.mod;
+ if (sema.generic_owner == .none) return param_src.toSrcLoc(mod.declPtr(block.src_decl), mod);
+ const arg_decl = sema.generic_call_decl.unwrap().?;
+ const arg_src: LazySrcLoc = if (param_index == 0 and sema.generic_bound_arg_src != null)
+ sema.generic_bound_arg_src.?
+ else
+ .{ .call_arg = .{
+ .decl = arg_decl,
+ .call_node_offset = sema.generic_call_src.node_offset.x,
+ .arg_index = param_index - @intFromBool(sema.generic_bound_arg_src != null),
+ } };
+ return arg_src.toSrcLoc(mod.declPtr(arg_decl), mod);
+}
+
fn zirParam(
sema: *Sema,
block: *Block,
@@ -9226,7 +9241,6 @@ fn zirParam(
param_index: u32,
comptime_syntax: bool,
) CompileError!void {
- const mod = sema.mod;
const gpa = sema.gpa;
const inst_data = sema.code.instructions.items(.data)[inst].pl_tok;
const src = inst_data.src();
@@ -9330,15 +9344,8 @@ fn zirParam(
sema.comptime_args[param_index] = val.toIntern();
return;
}
- const arg_src: LazySrcLoc = if (param_index == 0 and sema.generic_bound_arg_src != null)
- sema.generic_bound_arg_src.?
- else if (sema.generic_call_src == .node_offset) .{ .call_arg = .{
- .decl = sema.generic_call_decl.unwrap().?,
- .call_node_offset = sema.generic_call_src.node_offset.x,
- .arg_index = param_index - @intFromBool(sema.generic_bound_arg_src != null),
- } } else src;
const msg = msg: {
- const src_loc = arg_src.toSrcLoc(mod.declPtr(block.src_decl), mod);
+ const src_loc = sema.genericArgSrcLoc(block, param_index, src);
const msg = try Module.ErrorMsg.create(gpa, src_loc, "{s}", .{
@as([]const u8, "runtime-known argument passed to comptime parameter"),
});
@@ -9384,7 +9391,6 @@ fn zirParamAnytype(
param_index: u32,
comptime_syntax: bool,
) CompileError!void {
- const mod = sema.mod;
const gpa = sema.gpa;
const inst_data = sema.code.instructions.items(.data)[inst].str_tok;
const param_name: Zir.NullTerminatedString = @enumFromInt(inst_data.start);
@@ -9398,13 +9404,6 @@ fn zirParamAnytype(
sema.comptime_args[param_index] = opv.toIntern();
return;
}
- const arg_src: LazySrcLoc = if (param_index == 0 and sema.generic_bound_arg_src != null)
- sema.generic_bound_arg_src.?
- else if (sema.generic_call_src == .node_offset) .{ .call_arg = .{
- .decl = sema.generic_call_decl.unwrap().?,
- .call_node_offset = sema.generic_call_src.node_offset.x,
- .arg_index = param_index - @intFromBool(sema.generic_bound_arg_src != null),
- } } else src;
if (comptime_syntax) {
if (try sema.resolveMaybeUndefVal(air_ref)) |val| {
@@ -9412,7 +9411,7 @@ fn zirParamAnytype(
return;
}
const msg = msg: {
- const src_loc = arg_src.toSrcLoc(mod.declPtr(block.src_decl), mod);
+ const src_loc = sema.genericArgSrcLoc(block, param_index, src);
const msg = try Module.ErrorMsg.create(gpa, src_loc, "{s}", .{
@as([]const u8, "runtime-known argument passed to comptime parameter"),
});
@@ -9432,7 +9431,7 @@ fn zirParamAnytype(
return;
}
const msg = msg: {
- const src_loc = arg_src.toSrcLoc(mod.declPtr(block.src_decl), mod);
+ const src_loc = sema.genericArgSrcLoc(block, param_index, src);
const msg = try Module.ErrorMsg.create(gpa, src_loc, "{s}", .{
@as([]const u8, "runtime-known argument passed to comptime-only type parameter"),
});