@@ -14,7 +14,7 @@ use rustc_infer::infer;
1414use rustc_infer:: traits:: { self , StatementAsExpression } ;
1515use rustc_middle:: lint:: in_external_macro;
1616use rustc_middle:: ty:: {
17- self , suggest_constraining_type_params, Binder , DefIdTree , IsSuggestable , Ty ,
17+ self , suggest_constraining_type_params, Binder , DefIdTree , IsSuggestable , ToPredicate , Ty ,
1818} ;
1919use rustc_session:: errors:: ExprParenthesesNeeded ;
2020use rustc_span:: symbol:: sym;
@@ -1278,15 +1278,13 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
12781278 && !results. expr_adjustments ( callee_expr) . iter ( ) . any ( |adj| matches ! ( adj. kind, ty:: adjustment:: Adjust :: Deref ( ..) ) )
12791279 // Check that we're in fact trying to clone into the expected type
12801280 && self . can_coerce ( * pointee_ty, expected_ty)
1281+ && let trait_ref = ty:: Binder :: dummy ( self . tcx . mk_trait_ref ( clone_trait_did, [ expected_ty] ) )
12811282 // And the expected type doesn't implement `Clone`
12821283 && !self . predicate_must_hold_considering_regions ( & traits:: Obligation :: new (
12831284 self . tcx ,
12841285 traits:: ObligationCause :: dummy ( ) ,
12851286 self . param_env ,
1286- ty:: Binder :: dummy ( self . tcx . mk_trait_ref (
1287- clone_trait_did,
1288- [ expected_ty] ,
1289- ) ) ,
1287+ trait_ref,
12901288 ) )
12911289 {
12921290 diag. span_note (
@@ -1305,6 +1303,8 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
13051303 diag,
13061304 vec ! [ ( param. name. as_str( ) , "Clone" , Some ( clone_trait_did) ) ] . into_iter ( ) ,
13071305 ) ;
1306+ } else {
1307+ self . suggest_derive ( diag, & [ ( trait_ref. to_predicate ( self . tcx ) , None , None ) ] ) ;
13081308 }
13091309 }
13101310 }
0 commit comments