@@ -1737,24 +1737,41 @@ impl<'a, 'tcx> InferCtxtPrivExt<'tcx> for InferCtxt<'a, 'tcx> {
1737
1737
pub fn recursive_type_with_infinite_size_error (
1738
1738
tcx : TyCtxt < ' tcx > ,
1739
1739
type_def_id : DefId ,
1740
- ) -> DiagnosticBuilder < ' tcx > {
1740
+ spans : Vec < Span > ,
1741
+ ) {
1741
1742
assert ! ( type_def_id. is_local( ) ) ;
1742
1743
let span = tcx. hir ( ) . span_if_local ( type_def_id) . unwrap ( ) ;
1743
1744
let span = tcx. sess . source_map ( ) . guess_head_span ( span) ;
1744
- let mut err = struct_span_err ! (
1745
- tcx. sess,
1746
- span,
1747
- E0072 ,
1748
- "recursive type `{}` has infinite size" ,
1749
- tcx. def_path_str( type_def_id)
1750
- ) ;
1745
+ let path = tcx. def_path_str ( type_def_id) ;
1746
+ let mut err =
1747
+ struct_span_err ! ( tcx. sess, span, E0072 , "recursive type `{}` has infinite size" , path) ;
1751
1748
err. span_label ( span, "recursive type has infinite size" ) ;
1752
- err. help ( & format ! (
1753
- "insert indirection (e.g., a `Box`, `Rc`, or `&`) \
1754
- at some point to make `{}` representable",
1755
- tcx. def_path_str( type_def_id)
1756
- ) ) ;
1757
- err
1749
+ for & span in & spans {
1750
+ err. span_label ( span, "recursive without indirection" ) ;
1751
+ }
1752
+ let msg = format ! (
1753
+ "insert some indirection (e.g., a `Box`, `Rc`, or `&`) to make `{}` representable" ,
1754
+ path,
1755
+ ) ;
1756
+ if spans. len ( ) <= 4 {
1757
+ err. multipart_suggestion (
1758
+ & msg,
1759
+ spans
1760
+ . iter ( )
1761
+ . flat_map ( |& span| {
1762
+ vec ! [
1763
+ ( span. shrink_to_lo( ) , "Box<" . to_string( ) ) ,
1764
+ ( span. shrink_to_hi( ) , ">" . to_string( ) ) ,
1765
+ ]
1766
+ . into_iter ( )
1767
+ } )
1768
+ . collect ( ) ,
1769
+ Applicability :: HasPlaceholders ,
1770
+ ) ;
1771
+ } else {
1772
+ err. help ( & msg) ;
1773
+ }
1774
+ err. emit ( ) ;
1758
1775
}
1759
1776
1760
1777
/// Summarizes information
0 commit comments