Rollup merge of #125080 - bvanjoi:fix-124946, r=nnethercote · rust-lang/rust@8c64acd (original) (raw)

`@@ -1143,7 +1143,9 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {

`

1143

1143

`}

`

1144

1144

`}

`

1145

1145

``

1146

``

`-

let label_span_not_found = |err: &mut Diag<'_>| {

`

``

1146

`+

let mut find_candidate_for_method = false;

`

``

1147

+

``

1148

`+

let mut label_span_not_found = |err: &mut Diag<'_>| {

`

1147

1149

`if unsatisfied_predicates.is_empty() {

`

1148

1150

`` err.span_label(span, format!("{item_kind} not found in {ty_str}"));

``

1149

1151

`let is_string_or_ref_str = match rcvr_ty.kind() {

`

`@@ -1219,6 +1221,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {

`

1219

1221

` err.note(format!(

`

1220

1222

`"the {item_kind} was found for\n{type_candidates}{additional_types}"

`

1221

1223

`));

`

``

1224

`+

find_candidate_for_method = mode == Mode::MethodCall;

`

1222

1225

`}

`

1223

1226

`}

`

1224

1227

`} else {

`

`@@ -1371,9 +1374,32 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {

`

1371

1374

`);

`

1372

1375

`}

`

1373

1376

`}

`

1374

``

`-

// If an appropriate error source is not found, check method chain for possible candiates

`

1375

``

`-

if unsatisfied_predicates.is_empty()

`

1376

``

`-

&& let Mode::MethodCall = mode

`

``

1377

+

``

1378

`+

if !find_candidate_for_method {

`

``

1379

`+

self.lookup_segments_chain_for_no_match_method(

`

``

1380

`+

&mut err,

`

``

1381

`+

item_name,

`

``

1382

`+

item_kind,

`

``

1383

`+

source,

`

``

1384

`+

no_match_data,

`

``

1385

`+

);

`

``

1386

`+

}

`

``

1387

+

``

1388

`+

self.note_derefed_ty_has_method(&mut err, source, rcvr_ty, item_name, expected);

`

``

1389

`+

Some(err)

`

``

1390

`+

}

`

``

1391

+

``

1392

`+

/// If an appropriate error source is not found, check method chain for possible candidates

`

``

1393

`+

fn lookup_segments_chain_for_no_match_method(

`

``

1394

`+

&self,

`

``

1395

`+

err: &mut Diag<'_>,

`

``

1396

`+

item_name: Ident,

`

``

1397

`+

item_kind: &str,

`

``

1398

`+

source: SelfSource<'tcx>,

`

``

1399

`+

no_match_data: &NoMatchData<'tcx>,

`

``

1400

`+

) {

`

``

1401

`+

if no_match_data.unsatisfied_predicates.is_empty()

`

``

1402

`+

&& let Mode::MethodCall = no_match_data.mode

`

1377

1403

` && let SelfSource::MethodCall(mut source_expr) = source

`

1378

1404

`{

`

1379

1405

`let mut stack_methods = vec![];

`

`@@ -1394,6 +1420,9 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {

`

1394

1420

`.unwrap_or(Ty::new_misc_error(self.tcx)),

`

1395

1421

`);

`

1396

1422

``

``

1423

`` +

// FIXME: probe_for_name_many searches for methods in inherent implementations,

``

``

1424

`` +

// so it may return a candidate that doesn't belong to this revr_ty. We need to

``

``

1425

`+

// check whether the instantiated type matches the received one.

`

1397

1426

`for _matched_method in self.probe_for_name_many(

`

1398

1427

`Mode::MethodCall,

`

1399

1428

` item_name,

`

`@@ -1416,8 +1445,6 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {

`

1416

1445

`);

`

1417

1446

`}

`

1418

1447

`}

`

1419

``

`-

self.note_derefed_ty_has_method(&mut err, source, rcvr_ty, item_name, expected);

`

1420

``

`-

Some(err)

`

1421

1448

`}

`

1422

1449

``

1423

1450

`fn find_likely_intended_associated_item(

`