@@ -1136,46 +1136,12 @@ auto ConvertForExplicitAs(Context& context, Parse::NodeId as_node,
11361136 {.kind = ConversionTarget::ExplicitAs, .type_id = type_id});
11371137}
11381138
1139- CARBON_DIAGNOSTIC (InCallToFunction, Note, " calling function declared here" );
1140-
1141- // Convert the object argument in a method call to match the `self` parameter.
1142- static auto ConvertSelf (Context& context, SemIR::LocId call_loc_id,
1143- SemIRLoc callee_loc,
1144- SemIR::SpecificId callee_specific_id,
1145- SemIR::InstId self_param_id, SemIR::InstId self_id)
1146- -> SemIR::InstId {
1147- if (!self_id.is_valid ()) {
1148- CARBON_DIAGNOSTIC (MissingObjectInMethodCall, Error,
1149- " missing object argument in method call" );
1150- context.emitter ()
1151- .Build (call_loc_id, MissingObjectInMethodCall)
1152- .Note (callee_loc, InCallToFunction)
1153- .Emit ();
1154- return SemIR::InstId::BuiltinError;
1155- }
1156-
1157- bool addr_pattern = context.insts ().Is <SemIR::AddrPattern>(self_param_id);
1158- DiagnosticAnnotationScope annotate_diagnostics (
1159- &context.emitter (), [&](auto & builder) {
1160- CARBON_DIAGNOSTIC (InCallToFunctionSelf, Note,
1161- " initializing `{0:addr self|self}` parameter of "
1162- " method declared here" ,
1163- BoolAsSelect);
1164- builder.Note (self_param_id, InCallToFunctionSelf, addr_pattern);
1165- });
1166-
1167- return CallerPatternMatch (context, callee_specific_id, self_param_id,
1168- self_id);
1169- }
1170-
11711139// TODO: consider moving this to pattern_match.h
1172- auto ConvertCallArgs (Context& context, SemIR::LocId call_loc_id,
1173- SemIR::InstId self_id,
1174- llvm::ArrayRef<SemIR::InstId> arg_refs,
1175- SemIR::InstId return_slot_arg_id,
1176- const CalleeParamsInfo& callee,
1177- SemIR::SpecificId callee_specific_id)
1178- -> SemIR::InstBlockId {
1140+ auto ConvertCallArgs (
1141+ Context& context, SemIR::LocId call_loc_id, SemIR::InstId self_id,
1142+ llvm::ArrayRef<SemIR::InstId> arg_refs, SemIR::InstId return_slot_arg_id,
1143+ const CalleeParamsInfo& callee, SemIR::InstId return_slot_pattern_id,
1144+ SemIR::SpecificId callee_specific_id) -> SemIR::InstBlockId {
11791145 auto implicit_param_patterns =
11801146 context.inst_blocks ().GetOrEmpty (callee.implicit_param_patterns_id );
11811147 auto param_patterns =
@@ -1184,68 +1150,31 @@ auto ConvertCallArgs(Context& context, SemIR::LocId call_loc_id,
11841150 // The caller should have ensured this callee has the right arity.
11851151 CARBON_CHECK (arg_refs.size () == param_patterns.size ());
11861152
1187- // Start building a block to hold the converted arguments.
1188- llvm::SmallVector<SemIR::InstId> args;
1189- args.reserve (implicit_param_patterns.size () + param_patterns.size () +
1190- return_slot_arg_id.is_valid ());
1191-
1192- // Check implicit parameters.
1153+ // Find self parameter pattern.
1154+ // TODO: Do this during initial traversal of implicit params.
1155+ auto self_param_id = SemIR::InstId::Invalid;
11931156 for (auto implicit_param_id : implicit_param_patterns) {
1194- if (implicit_param_id == SemIR::InstId::BuiltinError) {
1195- return SemIR::InstBlockId::Invalid;
1157+ if (SemIR::Function::GetNameFromPatternId (
1158+ context.sem_ir (), implicit_param_id) == SemIR::NameId::SelfValue) {
1159+ CARBON_CHECK (!self_param_id.is_valid ());
1160+ self_param_id = implicit_param_id;
11961161 }
1197- auto param_pattern_info = SemIR::Function::GetParamPatternInfoFromPatternId (
1198- context.sem_ir (), implicit_param_id);
1199- if (param_pattern_info.GetNameId (context.sem_ir ()) ==
1200- SemIR::NameId::SelfValue) {
1201- auto converted_self_id =
1202- ConvertSelf (context, call_loc_id, callee.callee_loc ,
1203- callee_specific_id, implicit_param_id, self_id);
1204- if (converted_self_id == SemIR::InstId::BuiltinError) {
1205- return SemIR::InstBlockId::Invalid;
1206- }
1207- args.push_back (converted_self_id);
1208- } else {
1209- CARBON_CHECK (!param_pattern_info.inst .runtime_index .is_valid (),
1210- " Unexpected implicit parameter passed at runtime" );
1211- }
1212- }
1213-
1214- // Check type conversions per-element.
1215- for (auto [i, arg_id, param_pattern_id] :
1216- llvm::enumerate (arg_refs, param_patterns)) {
1217- auto runtime_index = SemIR::Function::GetParamPatternInfoFromPatternId (
1218- context.sem_ir (), param_pattern_id)
1219- .inst .runtime_index ;
1220- if (!runtime_index.is_valid ()) {
1221- // Not a runtime parameter: we don't pass an argument.
1222- continue ;
1223- }
1224-
1225- DiagnosticAnnotationScope annotate_diagnostics (
1226- &context.emitter (), [&](auto & builder) {
1227- CARBON_DIAGNOSTIC (InCallToFunctionParam, Note,
1228- " initializing function parameter" );
1229- builder.Note (param_pattern_id, InCallToFunctionParam);
1230- });
1231-
1232- auto converted_arg_id = CallerPatternMatch (context, callee_specific_id,
1233- param_pattern_id, arg_id);
1234- if (converted_arg_id == SemIR::InstId::BuiltinError) {
1235- return SemIR::InstBlockId::Invalid;
1236- }
1237-
1238- CARBON_CHECK (static_cast <int32_t >(args.size ()) == runtime_index.index ,
1239- " Parameters not numbered in order." );
1240- args.push_back (converted_arg_id);
12411162 }
12421163
1243- // Track the return storage, if present.
1244- if (return_slot_arg_id.is_valid ()) {
1245- args.push_back (return_slot_arg_id);
1164+ if (self_param_id.is_valid () && !self_id.is_valid ()) {
1165+ CARBON_DIAGNOSTIC (MissingObjectInMethodCall, Error,
1166+ " missing object argument in method call" );
1167+ CARBON_DIAGNOSTIC (InCallToFunction, Note, " calling function declared here" );
1168+ context.emitter ()
1169+ .Build (call_loc_id, MissingObjectInMethodCall)
1170+ .Note (callee.callee_loc , InCallToFunction)
1171+ .Emit ();
1172+ self_id = SemIR::InstId::BuiltinError;
12461173 }
12471174
1248- return context.inst_blocks ().AddOrEmpty (args);
1175+ return CallerPatternMatch (context, callee_specific_id, self_param_id,
1176+ callee.param_patterns_id , return_slot_pattern_id,
1177+ self_id, arg_refs, return_slot_arg_id);
12491178}
12501179
12511180auto ExprAsType (Context& context, SemIR::LocId loc_id, SemIR::InstId value_id)
0 commit comments