@@ -562,13 +562,42 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> {
562
562
param_env,
563
563
new_trait_ref. without_const ( ) . to_predicate ( ) ,
564
564
) ;
565
+
565
566
if self . predicate_must_hold_modulo_regions ( & new_obligation) {
566
567
if let Ok ( snippet) = self . tcx . sess . source_map ( ) . span_to_snippet ( span) {
567
568
// We have a very specific type of error, where just borrowing this argument
568
569
// might solve the problem. In cases like this, the important part is the
569
570
// original type obligation, not the last one that failed, which is arbitrary.
570
571
// Because of this, we modify the error to refer to the original obligation and
571
572
// return early in the caller.
573
+
574
+
575
+ let has_colon = self
576
+ . tcx
577
+ . sess
578
+ . source_map ( )
579
+ . span_to_snippet ( span)
580
+ . map ( |w| w. contains ( ":" ) )
581
+ . unwrap_or ( false ) ;
582
+
583
+ let has_double_colon = self
584
+ . tcx
585
+ . sess
586
+ . source_map ( )
587
+ . span_to_snippet ( span)
588
+ . map ( |w| w. contains ( "::" ) )
589
+ . unwrap_or ( false ) ;
590
+
591
+ let has_bracket = self
592
+ . tcx
593
+ . sess
594
+ . source_map ( )
595
+ . span_to_snippet ( span)
596
+ . map ( |w| w. contains ( "{" ) )
597
+ . unwrap_or ( false ) ;
598
+
599
+
600
+
572
601
let msg = format ! (
573
602
"the trait bound `{}: {}` is not satisfied" ,
574
603
found,
@@ -591,12 +620,23 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> {
591
620
obligation. parent_trait_ref. skip_binder( ) . print_only_trait_path( ) ,
592
621
) ,
593
622
) ;
594
- err. span_suggestion (
595
- span,
596
- "consider borrowing here" ,
597
- format ! ( "&{}" , snippet) ,
598
- Applicability :: MaybeIncorrect ,
599
- ) ;
623
+
624
+ // This if is to prevent a special edge-case
625
+ if !has_colon || has_double_colon || has_bracket {
626
+ // We don't want a borrowing suggestion on the fields in structs,
627
+ // ```
628
+ // struct Foo {
629
+ // the_foos: Vec<Foo>
630
+ // }
631
+ // ```
632
+
633
+ err. span_suggestion (
634
+ span,
635
+ "consider borrowing here" ,
636
+ format ! ( "&{}" , snippet) ,
637
+ Applicability :: MaybeIncorrect ,
638
+ ) ;
639
+ }
600
640
return true ;
601
641
}
602
642
}
0 commit comments