@@ -1747,24 +1747,41 @@ impl<'a, 'tcx> InferCtxtPrivExt<'tcx> for InferCtxt<'a, 'tcx> {
17471747pub fn recursive_type_with_infinite_size_error (
17481748 tcx : TyCtxt < ' tcx > ,
17491749 type_def_id : DefId ,
1750- ) -> DiagnosticBuilder < ' tcx > {
1750+ spans : Vec < Span > ,
1751+ ) {
17511752 assert ! ( type_def_id. is_local( ) ) ;
17521753 let span = tcx. hir ( ) . span_if_local ( type_def_id) . unwrap ( ) ;
17531754 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) ;
17611758 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 ( ) ;
17681785}
17691786
17701787/// Summarizes information
0 commit comments