Change:
` " ); } This had me VERY confused as I was certain I would try to get a String here, where does Example come from?? And associated types wut?? The problem is I used which should have been :D Maybe rustc could improve its suggestion somehow in that case? No response No response <!-- TRIAGEBOTSTART --<!-- TRIAGEBOTASSIGNSTART --<!-- TRIAGEBOTASSIGNDATASTARTTRIAGEBOTASSIGNDATAEND --<!-- TRIAGEBOTASSIGNEND --<!-- TRIAGEBOT_END --
For reference, here is a MRE:
claim

Discussion:
use rustc_hir as hir; use rustc_hir::def_id::{DefId, LocalDefId}; use rustc_infer::traits::FulfillmentError; <ins> use rustc_middle::query::Key; </ins> use rustc_middle::ty::{self, suggest_constraining_type_param, Ty, TyCtxt, TypeVisitableExt}; use rustc_session::parse::feature_err; use rustc_span::edit_distance::find_best_match_for_name;

self.set_tainted_by_errors(err.emit()); } <ins> /// On ambiguous associated type, look for an associated function whose name matches the /// extended path and, if found, emit an E0223 error with a structured suggestion. /// e.g. for `String::from::utf8`, suggest `String::from_utf8` (#109195) pub(crate) fn maybe_report_similar_assoc_fn( &self, span: Span, qself_ty: Ty<'tcx>, qself: &hir::Ty<'_>, ) -> Result<(), ErrorGuaranteed> { let tcx = self.tcx(); if let Some((_, node)) = tcx.hir().parent_iter(qself.hir_id).skip(1).next() && let hir::Node::Expr(hir::Expr { kind: hir::ExprKind::Path(hir::QPath::TypeRelative( hir::Ty { kind: hir::TyKind::Path(hir::QPath::TypeRelative( _, hir::PathSegment { ident: ident2, .. }, )), .. }, hir::PathSegment { ident: ident3, .. }, )), .. }) = node && let Some(ty_def_id) = qself_ty.ty_def_id() && let Ok([inherent_impl]) = tcx.inherent_impls(ty_def_id) && let name = format!("{ident2}_{ident3}") && let Some(ty::AssocItem { kind: ty::AssocKind::Fn, .. }) = tcx .associated_items(inherent_impl) .filter_by_name_unhygienic(Symbol::intern(&name)) .next() { let reported = struct_span_code_err!(tcx.dcx(), span, E0223, "ambiguous associated type") .with_span_suggestion_verbose( ident2.span.to(ident3.span), format!("there is an associated function with a similar name: `{name}`"), name, Applicability::MaybeIncorrect, ) .emit(); self.set_tainted_by_errors(reported); Err(reported) } else { Ok(()) } } </ins> } /// Emits an error regarding forbidden type binding associations

) .emit() // Already reported in an earlier stage. } else { <ins> self.maybe_report_similar_assoc_fn(span, qself_ty, qself)?; </ins> let traits: Vec<_> = self.probe_traits_that_match_assoc_ty(qself_ty, assoc_ident);

<ins> fn main() { String::from::utf8; //~^ ERROR ambiguous associated type [E0223] //~| HELP there is an associated function with a similar name: `from_utf8` String::from::utf8(); //~^ ERROR ambiguous associated type [E0223] //~| HELP there is an associated function with a similar name: `from_utf8` String::from::utf16(); //~^ ERROR ambiguous associated type [E0223] //~| HELP there is an associated function with a similar name: `from_utf16` String::from::method_that_doesnt_exist(); //~^ ERROR ambiguous associated type [E0223] //~| HELP if there were a trait named `Example` with associated type `from` str::from::utf8(); //~^ ERROR ambiguous associated type [E0223] //~| HELP if there were a trait named `Example` with associated type `from` str::from::utf8_mut(); //~^ ERROR ambiguous associated type [E0223] //~| HELP if there were a trait named `Example` with associated type `from` } </ins>

<ins> error[E0223]: ambiguous associated type --> $DIR/issue-109195.rs:2:5 | LL |     String::from::utf8; |     ^^^^^^^^^^^^ | help: there is an associated function with a similar name: `from_utf8` | LL |     String::from_utf8; |             ~~~~~~~~~ error[E0223]: ambiguous associated type --> $DIR/issue-109195.rs:5:5 | LL |     String::from::utf8(); |     ^^^^^^^^^^^^ | help: there is an associated function with a similar name: `from_utf8` | LL |     String::from_utf8(); |             ~~~~~~~~~ error[E0223]: ambiguous associated type --> $DIR/issue-109195.rs:8:5 | LL |     String::from::utf16(); |     ^^^^^^^^^^^^ | help: there is an associated function with a similar name: `from_utf16` | LL |     String::from_utf16(); |             ~~~~~~~~~~ error[E0223]: ambiguous associated type --> $DIR/issue-109195.rs:11:5 | LL |     String::from::method_that_doesnt_exist(); |     ^^^^^^^^^^^^ | help: if there were a trait named `Example` with associated type `from` implemented for `String`, you could use the fully-qualified path | LL |     <String as Example>::from::method_that_doesnt_exist(); |     ~~~~~~~~~~~~~~~~~~~~~~~~~ error[E0223]: ambiguous associated type --> $DIR/issue-109195.rs:14:5 | LL |     str::from::utf8(); |     ^^^^^^^^^ | help: if there were a trait named `Example` with associated type `from` implemented for `str`, you could use the fully-qualified path | LL |     <str as Example>::from::utf8(); |     ~~~~~~~~~~~~~~~~~~~~~~ error[E0223]: ambiguous associated type --> $DIR/issue-109195.rs:17:5 | LL |     str::from::utf8_mut(); |     ^^^^^^^^^ | help: if there were a trait named `Example` with associated type `from` implemented for `str`, you could use the fully-qualified path | LL |     <str as Example>::from::utf8_mut(); |     ~~~~~~~~~~~~~~~~~~~~~~ error: aborting due to 6 previous errors For more information about this error, try `rustc --explain E0223`. </ins>