@@ -1737,24 +1737,41 @@ impl<'a, 'tcx> InferCtxtPrivExt<'tcx> for InferCtxt<'a, 'tcx> {
17371737pub fn recursive_type_with_infinite_size_error (
17381738 tcx : TyCtxt < ' tcx > ,
17391739 type_def_id : DefId ,
1740- ) -> DiagnosticBuilder < ' tcx > {
1740+ spans : Vec < Span > ,
1741+ ) {
17411742 assert ! ( type_def_id. is_local( ) ) ;
17421743 let span = tcx. hir ( ) . span_if_local ( type_def_id) . unwrap ( ) ;
17431744 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) ;
17511748 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 ( ) ;
17581775}
17591776
17601777/// Summarizes information
0 commit comments