diff options
| author | Jacob Young <jacobly0@users.noreply.github.com> | 2023-08-09 09:26:16 -0400 |
|---|---|---|
| committer | Jacob Young <jacobly0@users.noreply.github.com> | 2023-08-09 10:09:01 -0400 |
| commit | 736df276632ad66294a7491a5e35a039dd2c836f (patch) | |
| tree | 3f81ef72acd1d2ac6ea722c9dbfaafe1d06bb1b2 /src/Sema.zig | |
| parent | 9630379a8ec593adc65880e814e4c7161b6d5775 (diff) | |
| download | zig-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.zig | 37 |
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"), }); |
