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