@@ -39,9 +39,7 @@ use rustc_span::{BytePos, DUMMY_SP, STDLIB_STABLE_CRATES, Span, Symbol, sym};
3939use tracing:: { debug, instrument} ;
4040
4141use super :: suggestions:: get_explanation_based_on_obligation;
42- use super :: {
43- ArgKind , CandidateSimilarity , FindExprBySpan , GetSafeTransmuteErrorAndReason , ImplCandidate ,
44- } ;
42+ use super :: { ArgKind , CandidateSimilarity , GetSafeTransmuteErrorAndReason , ImplCandidate } ;
4543use crate :: error_reporting:: TypeErrCtxt ;
4644use crate :: error_reporting:: infer:: TyCategory ;
4745use crate :: error_reporting:: traits:: report_dyn_incompatibility;
@@ -452,50 +450,13 @@ impl<'a, 'tcx> TypeErrCtxt<'a, 'tcx> {
452450 self . suggest_dereferencing_index ( & obligation, & mut err, leaf_trait_predicate) ;
453451 suggested |= self . suggest_dereferences ( & obligation, & mut err, leaf_trait_predicate) ;
454452 suggested |= self . suggest_fn_call ( & obligation, & mut err, leaf_trait_predicate) ;
455- let impl_candidates = self . find_similar_impl_candidates ( leaf_trait_predicate) ;
456- suggested = if let & [ cand] = & impl_candidates[ ..] {
457- let cand = cand. trait_ref ;
458- if let ( ty:: FnPtr ( ..) , ty:: FnDef ( ..) ) =
459- ( cand. self_ty ( ) . kind ( ) , main_trait_predicate. self_ty ( ) . skip_binder ( ) . kind ( ) )
460- {
461- // Wrap method receivers and `&`-references in parens
462- let suggestion = if self . tcx . sess . source_map ( ) . span_followed_by ( span, "." ) . is_some ( ) {
463- vec ! [
464- ( span. shrink_to_lo( ) , format!( "(" ) ) ,
465- ( span. shrink_to_hi( ) , format!( " as {})" , cand. self_ty( ) ) ) ,
466- ]
467- } else if let Some ( body) = self . tcx . hir_maybe_body_owned_by ( obligation. cause . body_id ) {
468- let mut expr_finder = FindExprBySpan :: new ( span, self . tcx ) ;
469- expr_finder. visit_expr ( body. value ) ;
470- if let Some ( expr) = expr_finder. result &&
471- let hir:: ExprKind :: AddrOf ( _, _, expr) = expr. kind {
472- vec ! [
473- ( expr. span. shrink_to_lo( ) , format!( "(" ) ) ,
474- ( expr. span. shrink_to_hi( ) , format!( " as {})" , cand. self_ty( ) ) ) ,
475- ]
476- } else {
477- vec ! [ ( span. shrink_to_hi( ) , format!( " as {}" , cand. self_ty( ) ) ) ]
478- }
479- } else {
480- vec ! [ ( span. shrink_to_hi( ) , format!( " as {}" , cand. self_ty( ) ) ) ]
481- } ;
482- let trait_ = self . tcx . short_string ( cand. print_trait_sugared ( ) , err. long_ty_path ( ) ) ;
483- let ty = self . tcx . short_string ( cand. self_ty ( ) , err. long_ty_path ( ) ) ;
484- err. multipart_suggestion (
485- format ! (
486- "the trait `{trait_}` is implemented for fn pointer \
487- `{ty}`, try casting using `as`",
488- ) ,
489- suggestion,
490- Applicability :: MaybeIncorrect ,
491- ) ;
492- true
493- } else {
494- false
495- }
496- } else {
497- false
498- } || suggested;
453+ suggested |= self . suggest_cast_to_fn_pointer (
454+ & obligation,
455+ & mut err,
456+ leaf_trait_predicate,
457+ main_trait_predicate,
458+ span,
459+ ) ;
499460 suggested |=
500461 self . suggest_remove_reference ( & obligation, & mut err, leaf_trait_predicate) ;
501462 suggested |= self . suggest_semicolon_removal (
0 commit comments