| ... | @@ -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 the | 70 | /// instantiation can point back to the instantiation site in addition to the |
| 71 | /// declaration site. | 71 | /// declaration site. |
| 72 | generic_call_src: LazySrcLoc = .unneeded, | 72 | generic_call_src: LazySrcLoc = .unneeded, |
| | 73 | generic_bound_arg_src: ?LazySrcLoc = null, |
| 73 | /// Corresponds to `generic_call_src`. | 74 | /// Corresponds to `generic_call_src`. |
| 74 | generic_call_decl: Decl.OptionalIndex = .none, | 75 | generic_call_decl: Decl.OptionalIndex = .none, |
| 75 | /// The key is types that must be fully resolved prior to machine code | 76 | /// 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; |
| 7091 | | 7095 | |
| 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 | } |
| 8599 | | 8607 | |
| ... | @@ -9211,6 +9219,21 @@ fn finishFunc( | ... | @@ -9211,6 +9219,21 @@ fn finishFunc( |
| 9211 | return Air.internedToRef(if (opt_func_index != .none) opt_func_index else func_ty); | 9219 | return Air.internedToRef(if (opt_func_index != .none) opt_func_index else func_ty); |
| 9212 | } | 9220 | } |
| 9213 | | 9221 | |
| | 9222 | fn genericArgSrcLoc(sema: *Sema, block: *Block, param_index: u32, param_src: LazySrcLoc) Module.SrcLoc { |
| | 9223 | const mod = sema.mod; |
| | 9224 | if (sema.generic_owner == .none) return param_src.toSrcLoc(mod.declPtr(block.src_decl), mod); |
| | 9225 | const arg_decl = sema.generic_call_decl.unwrap().?; |
| | 9226 | const arg_src: LazySrcLoc = if (param_index == 0 and sema.generic_bound_arg_src != null) |
| | 9227 | sema.generic_bound_arg_src.? |
| | 9228 | else |
| | 9229 | .{ .call_arg = .{ |
| | 9230 | .decl = arg_decl, |
| | 9231 | .call_node_offset = sema.generic_call_src.node_offset.x, |
| | 9232 | .arg_index = param_index - @intFromBool(sema.generic_bound_arg_src != null), |
| | 9233 | } }; |
| | 9234 | return arg_src.toSrcLoc(mod.declPtr(arg_decl), mod); |
| | 9235 | } |
| | 9236 | |
| 9214 | fn zirParam( | 9237 | fn zirParam( |
| 9215 | sema: *Sema, | 9238 | sema: *Sema, |
| 9216 | block: *Block, | 9239 | block: *Block, |
| ... | @@ -9218,7 +9241,6 @@ fn zirParam( | ... | @@ -9218,7 +9241,6 @@ fn zirParam( |
| 9218 | param_index: u32, | 9241 | param_index: u32, |
| 9219 | comptime_syntax: bool, | 9242 | comptime_syntax: bool, |
| 9220 | ) CompileError!void { | 9243 | ) CompileError!void { |
| 9221 | const mod = sema.mod; | | |
| 9222 | const gpa = sema.gpa; | 9244 | const gpa = sema.gpa; |
| 9223 | const inst_data = sema.code.instructions.items(.data)[inst].pl_tok; | 9245 | const inst_data = sema.code.instructions.items(.data)[inst].pl_tok; |
| 9224 | const src = inst_data.src(); | 9246 | const src = inst_data.src(); |
| ... | @@ -9235,17 +9257,20 @@ fn zirParam( | ... | @@ -9235,17 +9257,20 @@ fn zirParam( |
| 9235 | const prev_no_partial_func_type = sema.no_partial_func_ty; | 9257 | const prev_no_partial_func_type = sema.no_partial_func_ty; |
| 9236 | const prev_generic_owner = sema.generic_owner; | 9258 | const prev_generic_owner = sema.generic_owner; |
| 9237 | const prev_generic_call_src = sema.generic_call_src; | 9259 | const prev_generic_call_src = sema.generic_call_src; |
| | 9260 | const prev_generic_bound_arg_src = sema.generic_bound_arg_src; |
| 9238 | const prev_generic_call_decl = sema.generic_call_decl; | 9261 | const prev_generic_call_decl = sema.generic_call_decl; |
| 9239 | block.params = .{}; | 9262 | block.params = .{}; |
| 9240 | sema.no_partial_func_ty = true; | 9263 | sema.no_partial_func_ty = true; |
| 9241 | sema.generic_owner = .none; | 9264 | sema.generic_owner = .none; |
| 9242 | sema.generic_call_src = .unneeded; | 9265 | sema.generic_call_src = .unneeded; |
| | 9266 | sema.generic_bound_arg_src = null; |
| 9243 | sema.generic_call_decl = .none; | 9267 | sema.generic_call_decl = .none; |
| 9244 | defer { | 9268 | defer { |
| 9245 | block.params = prev_params; | 9269 | block.params = prev_params; |
| 9246 | sema.no_partial_func_ty = prev_no_partial_func_type; | 9270 | sema.no_partial_func_ty = prev_no_partial_func_type; |
| 9247 | sema.generic_owner = prev_generic_owner; | 9271 | sema.generic_owner = prev_generic_owner; |
| 9248 | sema.generic_call_src = prev_generic_call_src; | 9272 | sema.generic_call_src = prev_generic_call_src; |
| | 9273 | sema.generic_bound_arg_src = prev_generic_bound_arg_src; |
| 9249 | sema.generic_call_decl = prev_generic_call_decl; | 9274 | sema.generic_call_decl = prev_generic_call_decl; |
| 9250 | } | 9275 | } |
| 9251 | | 9276 | |
| ... | @@ -9319,13 +9344,8 @@ fn zirParam( | ... | @@ -9319,13 +9344,8 @@ fn zirParam( |
| 9319 | sema.comptime_args[param_index] = val.toIntern(); | 9344 | sema.comptime_args[param_index] = val.toIntern(); |
| 9320 | return; | 9345 | return; |
| 9321 | } | 9346 | } |
| 9322 | const arg_src: LazySrcLoc = if (sema.generic_call_src == .node_offset) .{ .call_arg = .{ | | |
| 9323 | .decl = sema.generic_call_decl.unwrap().?, | | |
| 9324 | .call_node_offset = sema.generic_call_src.node_offset.x, | | |
| 9325 | .arg_index = param_index, | | |
| 9326 | } } else src; | | |
| 9327 | const msg = msg: { | 9347 | const msg = msg: { |
| 9328 | const src_loc = arg_src.toSrcLoc(mod.declPtr(block.src_decl), mod); | 9348 | const src_loc = sema.genericArgSrcLoc(block, param_index, src); |
| 9329 | const msg = try Module.ErrorMsg.create(gpa, src_loc, "{s}", .{ | 9349 | const msg = try Module.ErrorMsg.create(gpa, src_loc, "{s}", .{ |
| 9330 | @as([]const u8, "runtime-known argument passed to comptime parameter"), | 9350 | @as([]const u8, "runtime-known argument passed to comptime parameter"), |
| 9331 | }); | 9351 | }); |
| ... | @@ -9371,7 +9391,6 @@ fn zirParamAnytype( | ... | @@ -9371,7 +9391,6 @@ fn zirParamAnytype( |
| 9371 | param_index: u32, | 9391 | param_index: u32, |
| 9372 | comptime_syntax: bool, | 9392 | comptime_syntax: bool, |
| 9373 | ) CompileError!void { | 9393 | ) CompileError!void { |
| 9374 | const mod = sema.mod; | | |
| 9375 | const gpa = sema.gpa; | 9394 | const gpa = sema.gpa; |
| 9376 | const inst_data = sema.code.instructions.items(.data)[inst].str_tok; | 9395 | const inst_data = sema.code.instructions.items(.data)[inst].str_tok; |
| 9377 | const param_name: Zir.NullTerminatedString = @enumFromInt(inst_data.start); | 9396 | const param_name: Zir.NullTerminatedString = @enumFromInt(inst_data.start); |
| ... | @@ -9385,11 +9404,6 @@ fn zirParamAnytype( | ... | @@ -9385,11 +9404,6 @@ fn zirParamAnytype( |
| 9385 | sema.comptime_args[param_index] = opv.toIntern(); | 9404 | sema.comptime_args[param_index] = opv.toIntern(); |
| 9386 | return; | 9405 | return; |
| 9387 | } | 9406 | } |
| 9388 | const arg_src: LazySrcLoc = if (sema.generic_call_src == .node_offset) .{ .call_arg = .{ | | |
| 9389 | .decl = sema.generic_call_decl.unwrap().?, | | |
| 9390 | .call_node_offset = sema.generic_call_src.node_offset.x, | | |
| 9391 | .arg_index = param_index, | | |
| 9392 | } } else src; | | |
| 9393 | | 9407 | |
| 9394 | if (comptime_syntax) { | 9408 | if (comptime_syntax) { |
| 9395 | if (try sema.resolveMaybeUndefVal(air_ref)) |val| { | 9409 | if (try sema.resolveMaybeUndefVal(air_ref)) |val| { |
| ... | @@ -9397,7 +9411,7 @@ fn zirParamAnytype( | ... | @@ -9397,7 +9411,7 @@ fn zirParamAnytype( |
| 9397 | return; | 9411 | return; |
| 9398 | } | 9412 | } |
| 9399 | const msg = msg: { | 9413 | const msg = msg: { |
| 9400 | const src_loc = arg_src.toSrcLoc(mod.declPtr(block.src_decl), mod); | 9414 | const src_loc = sema.genericArgSrcLoc(block, param_index, src); |
| 9401 | const msg = try Module.ErrorMsg.create(gpa, src_loc, "{s}", .{ | 9415 | const msg = try Module.ErrorMsg.create(gpa, src_loc, "{s}", .{ |
| 9402 | @as([]const u8, "runtime-known argument passed to comptime parameter"), | 9416 | @as([]const u8, "runtime-known argument passed to comptime parameter"), |
| 9403 | }); | 9417 | }); |
| ... | @@ -9417,7 +9431,7 @@ fn zirParamAnytype( | ... | @@ -9417,7 +9431,7 @@ fn zirParamAnytype( |
| 9417 | return; | 9431 | return; |
| 9418 | } | 9432 | } |
| 9419 | const msg = msg: { | 9433 | const msg = msg: { |
| 9420 | const src_loc = arg_src.toSrcLoc(mod.declPtr(block.src_decl), mod); | 9434 | const src_loc = sema.genericArgSrcLoc(block, param_index, src); |
| 9421 | const msg = try Module.ErrorMsg.create(gpa, src_loc, "{s}", .{ | 9435 | const msg = try Module.ErrorMsg.create(gpa, src_loc, "{s}", .{ |
| 9422 | @as([]const u8, "runtime-known argument passed to comptime-only type parameter"), | 9436 | @as([]const u8, "runtime-known argument passed to comptime-only type parameter"), |
| 9423 | }); | 9437 | }); |