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,...@@ -70,6 +70,7 @@ generic_owner: InternPool.Index = .none,
70/// instantiation can point back to the instantiation site in addition to the70/// instantiation can point back to the instantiation site in addition to the
71/// declaration site.71/// declaration site.
72generic_call_src: LazySrcLoc = .unneeded,72generic_call_src: LazySrcLoc = .unneeded,
73generic_bound_arg_src: ?LazySrcLoc = null,
73/// Corresponds to `generic_call_src`.74/// Corresponds to `generic_call_src`.
74generic_call_decl: Decl.OptionalIndex = .none,75generic_call_decl: Decl.OptionalIndex = .none,
75/// The key is types that must be fully resolved prior to machine code76/// The key is types that must be fully resolved prior to machine code
...@@ -7077,16 +7078,19 @@ fn analyzeCall(...@@ -7077,16 +7078,19 @@ fn analyzeCall(
7077 const parent_fn_ret_ty_ies = sema.fn_ret_ty_ies;7078 const parent_fn_ret_ty_ies = sema.fn_ret_ty_ies;
7078 const parent_generic_owner = sema.generic_owner;7079 const parent_generic_owner = sema.generic_owner;
7079 const parent_generic_call_src = sema.generic_call_src;7080 const parent_generic_call_src = sema.generic_call_src;
7081 const parent_generic_bound_arg_src = sema.generic_bound_arg_src;
7080 const parent_generic_call_decl = sema.generic_call_decl;7082 const parent_generic_call_decl = sema.generic_call_decl;
7081 sema.fn_ret_ty = bare_return_type;7083 sema.fn_ret_ty = bare_return_type;
7082 sema.fn_ret_ty_ies = null;7084 sema.fn_ret_ty_ies = null;
7083 sema.generic_owner = .none;7085 sema.generic_owner = .none;
7084 sema.generic_call_src = .unneeded;7086 sema.generic_call_src = .unneeded;
7087 sema.generic_bound_arg_src = null;
7085 sema.generic_call_decl = .none;7088 sema.generic_call_decl = .none;
7086 defer sema.fn_ret_ty = parent_fn_ret_ty;7089 defer sema.fn_ret_ty = parent_fn_ret_ty;
7087 defer sema.fn_ret_ty_ies = parent_fn_ret_ty_ies;7090 defer sema.fn_ret_ty_ies = parent_fn_ret_ty_ies;
7088 defer sema.generic_owner = parent_generic_owner;7091 defer sema.generic_owner = parent_generic_owner;
7089 defer sema.generic_call_src = parent_generic_call_src;7092 defer sema.generic_call_src = parent_generic_call_src;
7093 defer sema.generic_bound_arg_src = parent_generic_bound_arg_src;
7090 defer sema.generic_call_decl = parent_generic_call_decl;7094 defer sema.generic_call_decl = parent_generic_call_decl;
70917095
7092 if (module_fn.analysis(ip).inferred_error_set) {7096 if (module_fn.analysis(ip).inferred_error_set) {
...@@ -7545,6 +7549,7 @@ fn instantiateGenericCall(...@@ -7545,6 +7549,7 @@ fn instantiateGenericCall(
7545 .comptime_args = comptime_args,7549 .comptime_args = comptime_args,
7546 .generic_owner = generic_owner,7550 .generic_owner = generic_owner,
7547 .generic_call_src = call_src,7551 .generic_call_src = call_src,
7552 .generic_bound_arg_src = bound_arg_src,
7548 .generic_call_decl = block.src_decl.toOptional(),7553 .generic_call_decl = block.src_decl.toOptional(),
7549 .branch_quota = sema.branch_quota,7554 .branch_quota = sema.branch_quota,
7550 .branch_count = sema.branch_count,7555 .branch_count = sema.branch_count,
...@@ -8583,17 +8588,20 @@ fn resolveGenericBody(...@@ -8583,17 +8588,20 @@ fn resolveGenericBody(
8583 const prev_no_partial_func_type = sema.no_partial_func_ty;8588 const prev_no_partial_func_type = sema.no_partial_func_ty;
8584 const prev_generic_owner = sema.generic_owner;8589 const prev_generic_owner = sema.generic_owner;
8585 const prev_generic_call_src = sema.generic_call_src;8590 const prev_generic_call_src = sema.generic_call_src;
8591 const prev_generic_bound_arg_src = sema.generic_bound_arg_src;
8586 const prev_generic_call_decl = sema.generic_call_decl;8592 const prev_generic_call_decl = sema.generic_call_decl;
8587 block.params = .{};8593 block.params = .{};
8588 sema.no_partial_func_ty = true;8594 sema.no_partial_func_ty = true;
8589 sema.generic_owner = .none;8595 sema.generic_owner = .none;
8590 sema.generic_call_src = .unneeded;8596 sema.generic_call_src = .unneeded;
8597 sema.generic_bound_arg_src = null;
8591 sema.generic_call_decl = .none;8598 sema.generic_call_decl = .none;
8592 defer {8599 defer {
8593 block.params = prev_params;8600 block.params = prev_params;
8594 sema.no_partial_func_ty = prev_no_partial_func_type;8601 sema.no_partial_func_ty = prev_no_partial_func_type;
8595 sema.generic_owner = prev_generic_owner;8602 sema.generic_owner = prev_generic_owner;
8596 sema.generic_call_src = prev_generic_call_src;8603 sema.generic_call_src = prev_generic_call_src;
8604 sema.generic_bound_arg_src = prev_generic_bound_arg_src;
8597 sema.generic_call_decl = prev_generic_call_decl;8605 sema.generic_call_decl = prev_generic_call_decl;
8598 }8606 }
85998607
...@@ -9235,17 +9243,20 @@ fn zirParam(...@@ -9235,17 +9243,20 @@ fn zirParam(
9235 const prev_no_partial_func_type = sema.no_partial_func_ty;9243 const prev_no_partial_func_type = sema.no_partial_func_ty;
9236 const prev_generic_owner = sema.generic_owner;9244 const prev_generic_owner = sema.generic_owner;
9237 const prev_generic_call_src = sema.generic_call_src;9245 const prev_generic_call_src = sema.generic_call_src;
9246 const prev_generic_bound_arg_src = sema.generic_bound_arg_src;
9238 const prev_generic_call_decl = sema.generic_call_decl;9247 const prev_generic_call_decl = sema.generic_call_decl;
9239 block.params = .{};9248 block.params = .{};
9240 sema.no_partial_func_ty = true;9249 sema.no_partial_func_ty = true;
9241 sema.generic_owner = .none;9250 sema.generic_owner = .none;
9242 sema.generic_call_src = .unneeded;9251 sema.generic_call_src = .unneeded;
9252 sema.generic_bound_arg_src = null;
9243 sema.generic_call_decl = .none;9253 sema.generic_call_decl = .none;
9244 defer {9254 defer {
9245 block.params = prev_params;9255 block.params = prev_params;
9246 sema.no_partial_func_ty = prev_no_partial_func_type;9256 sema.no_partial_func_ty = prev_no_partial_func_type;
9247 sema.generic_owner = prev_generic_owner;9257 sema.generic_owner = prev_generic_owner;
9248 sema.generic_call_src = prev_generic_call_src;9258 sema.generic_call_src = prev_generic_call_src;
9259 sema.generic_bound_arg_src = prev_generic_bound_arg_src;
9249 sema.generic_call_decl = prev_generic_call_decl;9260 sema.generic_call_decl = prev_generic_call_decl;
9250 }9261 }
92519262
...@@ -9319,10 +9330,12 @@ fn zirParam(...@@ -9319,10 +9330,12 @@ fn zirParam(
9319 sema.comptime_args[param_index] = val.toIntern();9330 sema.comptime_args[param_index] = val.toIntern();
9320 return;9331 return;
9321 }9332 }
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 = .{
9323 .decl = sema.generic_call_decl.unwrap().?,9336 .decl = sema.generic_call_decl.unwrap().?,
9324 .call_node_offset = sema.generic_call_src.node_offset.x,9337 .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),
9326 } } else src;9339 } } else src;
9327 const msg = msg: {9340 const msg = msg: {
9328 const src_loc = arg_src.toSrcLoc(mod.declPtr(block.src_decl), mod);9341 const src_loc = arg_src.toSrcLoc(mod.declPtr(block.src_decl), mod);
...@@ -9385,10 +9398,12 @@ fn zirParamAnytype(...@@ -9385,10 +9398,12 @@ fn zirParamAnytype(
9385 sema.comptime_args[param_index] = opv.toIntern();9398 sema.comptime_args[param_index] = opv.toIntern();
9386 return;9399 return;
9387 }9400 }
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 = .{
9389 .decl = sema.generic_call_decl.unwrap().?,9404 .decl = sema.generic_call_decl.unwrap().?,
9390 .call_node_offset = sema.generic_call_src.node_offset.x,9405 .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),
9392 } } else src;9407 } } else src;
93939408
9394 if (comptime_syntax) {9409 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