authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-08-09 08:01:31-04:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-08-09 10:09:01-04:00
log9630379a8ec593adc65880e814e4c7161b6d5775
treed24df5d466fce2251d4ed0ff54d430f0961a3271
parentcd7998096b624b326dddcbb2752fe4bcdac8df9f

Sema: fix generic method argument source locations


3 files changed, 49 insertions(+), 25 deletions(-)

src/Sema.zig+19-4
......@@ -70,6 +70,7 @@ generic_owner: InternPool.Index = .none,
7070/// instantiation can point back to the instantiation site in addition to the
7171/// declaration site.
7272generic_call_src: LazySrcLoc = .unneeded,
73generic_bound_arg_src: ?LazySrcLoc = null,
7374/// Corresponds to `generic_call_src`.
7475generic_call_decl: Decl.OptionalIndex = .none,
7576/// The key is types that must be fully resolved prior to machine code
......@@ -7077,16 +7078,19 @@ fn analyzeCall(
70777078 const parent_fn_ret_ty_ies = sema.fn_ret_ty_ies;
70787079 const parent_generic_owner = sema.generic_owner;
70797080 const parent_generic_call_src = sema.generic_call_src;
7081 const parent_generic_bound_arg_src = sema.generic_bound_arg_src;
70807082 const parent_generic_call_decl = sema.generic_call_decl;
70817083 sema.fn_ret_ty = bare_return_type;
70827084 sema.fn_ret_ty_ies = null;
70837085 sema.generic_owner = .none;
70847086 sema.generic_call_src = .unneeded;
7087 sema.generic_bound_arg_src = null;
70857088 sema.generic_call_decl = .none;
70867089 defer sema.fn_ret_ty = parent_fn_ret_ty;
70877090 defer sema.fn_ret_ty_ies = parent_fn_ret_ty_ies;
70887091 defer sema.generic_owner = parent_generic_owner;
70897092 defer sema.generic_call_src = parent_generic_call_src;
7093 defer sema.generic_bound_arg_src = parent_generic_bound_arg_src;
70907094 defer sema.generic_call_decl = parent_generic_call_decl;
70917095
70927096 if (module_fn.analysis(ip).inferred_error_set) {
......@@ -7545,6 +7549,7 @@ fn instantiateGenericCall(
75457549 .comptime_args = comptime_args,
75467550 .generic_owner = generic_owner,
75477551 .generic_call_src = call_src,
7552 .generic_bound_arg_src = bound_arg_src,
75487553 .generic_call_decl = block.src_decl.toOptional(),
75497554 .branch_quota = sema.branch_quota,
75507555 .branch_count = sema.branch_count,
......@@ -8583,17 +8588,20 @@ fn resolveGenericBody(
85838588 const prev_no_partial_func_type = sema.no_partial_func_ty;
85848589 const prev_generic_owner = sema.generic_owner;
85858590 const prev_generic_call_src = sema.generic_call_src;
8591 const prev_generic_bound_arg_src = sema.generic_bound_arg_src;
85868592 const prev_generic_call_decl = sema.generic_call_decl;
85878593 block.params = .{};
85888594 sema.no_partial_func_ty = true;
85898595 sema.generic_owner = .none;
85908596 sema.generic_call_src = .unneeded;
8597 sema.generic_bound_arg_src = null;
85918598 sema.generic_call_decl = .none;
85928599 defer {
85938600 block.params = prev_params;
85948601 sema.no_partial_func_ty = prev_no_partial_func_type;
85958602 sema.generic_owner = prev_generic_owner;
85968603 sema.generic_call_src = prev_generic_call_src;
8604 sema.generic_bound_arg_src = prev_generic_bound_arg_src;
85978605 sema.generic_call_decl = prev_generic_call_decl;
85988606 }
85998607
......@@ -9235,17 +9243,20 @@ fn zirParam(
92359243 const prev_no_partial_func_type = sema.no_partial_func_ty;
92369244 const prev_generic_owner = sema.generic_owner;
92379245 const prev_generic_call_src = sema.generic_call_src;
9246 const prev_generic_bound_arg_src = sema.generic_bound_arg_src;
92389247 const prev_generic_call_decl = sema.generic_call_decl;
92399248 block.params = .{};
92409249 sema.no_partial_func_ty = true;
92419250 sema.generic_owner = .none;
92429251 sema.generic_call_src = .unneeded;
9252 sema.generic_bound_arg_src = null;
92439253 sema.generic_call_decl = .none;
92449254 defer {
92459255 block.params = prev_params;
92469256 sema.no_partial_func_ty = prev_no_partial_func_type;
92479257 sema.generic_owner = prev_generic_owner;
92489258 sema.generic_call_src = prev_generic_call_src;
9259 sema.generic_bound_arg_src = prev_generic_bound_arg_src;
92499260 sema.generic_call_decl = prev_generic_call_decl;
92509261 }
92519262
......@@ -9319,10 +9330,12 @@ fn zirParam(
93199330 sema.comptime_args[param_index] = val.toIntern();
93209331 return;
93219332 }
9322 const arg_src: LazySrcLoc = if (sema.generic_call_src == .node_offset) .{ .call_arg = .{
9333 const arg_src: LazySrcLoc = if (param_index == 0 and sema.generic_bound_arg_src != null)
9334 sema.generic_bound_arg_src.?
9335 else if (sema.generic_call_src == .node_offset) .{ .call_arg = .{
93239336 .decl = sema.generic_call_decl.unwrap().?,
93249337 .call_node_offset = sema.generic_call_src.node_offset.x,
9325 .arg_index = param_index,
9338 .arg_index = param_index - @intFromBool(sema.generic_bound_arg_src != null),
93269339 } } else src;
93279340 const msg = msg: {
93289341 const src_loc = arg_src.toSrcLoc(mod.declPtr(block.src_decl), mod);
......@@ -9385,10 +9398,12 @@ fn zirParamAnytype(
93859398 sema.comptime_args[param_index] = opv.toIntern();
93869399 return;
93879400 }
9388 const arg_src: LazySrcLoc = if (sema.generic_call_src == .node_offset) .{ .call_arg = .{
9401 const arg_src: LazySrcLoc = if (param_index == 0 and sema.generic_bound_arg_src != null)
9402 sema.generic_bound_arg_src.?
9403 else if (sema.generic_call_src == .node_offset) .{ .call_arg = .{
93899404 .decl = sema.generic_call_decl.unwrap().?,
93909405 .call_node_offset = sema.generic_call_src.node_offset.x,
9391 .arg_index = param_index,
9406 .arg_index = param_index - @intFromBool(sema.generic_bound_arg_src != null),
93929407 } } else src;
93939408
93949409 if (comptime_syntax) {
test/cases/compile_errors/generic_method_call_invalid_coercion.zig deleted-21
......@@ -1,21 +0,0 @@
1export fn callBoolMethod() void {
2 const s = S{};
3 s.boolMethod({});
4}
5
6export fn callVoidMethod() void {
7 const s = S{};
8 s.voidMethod(false);
9}
10
11const S = struct {
12 fn boolMethod(comptime _: @This(), _: bool) void {}
13 fn voidMethod(comptime _: @This(), _: void) void {}
14};
15
16// error
17// backend=stage2
18// target=native
19//
20// :3:18: error: expected type 'bool', found 'void'
21// :8:18: error: expected type 'void', found 'bool'
test/cases/compile_errors/generic_method_call_with_invalid_param.zig created+30
......@@ -0,0 +1,30 @@
1export fn callBoolMethodWithVoid() void {
2 const s = S{};
3 s.boolMethod({});
4}
5
6export fn callVoidMethodWithBool() void {
7 const s = S{};
8 s.voidMethod(false);
9}
10
11export fn callComptimeBoolMethodWithRuntimeBool() void {
12 const s = S{};
13 var arg = true;
14 s.comptimeBoolMethod(arg);
15}
16
17const S = struct {
18 fn boolMethod(comptime _: @This(), _: bool) void {}
19 fn voidMethod(comptime _: @This(), _: void) void {}
20 fn comptimeBoolMethod(comptime _: @This(), comptime _: bool) void {}
21};
22
23// error
24// backend=stage2
25// target=native
26//
27// :3:18: error: expected type 'bool', found 'void'
28// :8:18: error: expected type 'void', found 'bool'
29// :14:26: error: runtime-known argument passed to comptime parameter
30// :20:57: note: declared comptime here