@@ -127,6 +127,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
127127 && used_place. is_prefix_of ( moved_place. as_ref ( ) )
128128 } ) ;
129129
130+ //FIXME: move to ftl
130131 let partial_str = if is_partial_move { "partial " } else { "" } ;
131132 let partially_str = if is_partial_move { "partially " } else { "" } ;
132133
@@ -180,13 +181,9 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
180181 let move_spans = self . move_spans ( moved_place. as_ref ( ) , move_out. source ) ;
181182 let move_span = move_spans. args_or_use ( ) ;
182183
183- let move_msg = if move_spans. for_closure ( ) { " into closure" } else { "" } ;
184+ let is_move_msg = move_spans. for_closure ( ) ;
184185
185- let loop_message = if location == move_out. source || move_site. traversed_back_edge {
186- ", in previous iteration of loop"
187- } else {
188- ""
189- } ;
186+ let is_loop_message = location == move_out. source || move_site. traversed_back_edge ;
190187
191188 if location == move_out. source {
192189 is_loop_move = true ;
@@ -203,9 +200,9 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
203200 move_span,
204201 move_spans,
205202 * moved_place,
206- partially_str ,
207- loop_message ,
208- move_msg ,
203+ is_partial_move ,
204+ is_loop_message ,
205+ is_move_msg ,
209206 is_loop_move,
210207 maybe_reinitialized_locations. is_empty ( ) ,
211208 ) ;
@@ -277,12 +274,21 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
277274 }
278275
279276 if needs_note {
280- let span = if let Some ( local) = place. as_local ( ) {
281- Some ( self . body . local_decls [ local] . source_info . span )
277+ if let Some ( local) = place. as_local ( ) {
278+ let span = self . body . local_decls [ local] . source_info . span ;
279+ err. subdiagnostic ( crate :: session_diagnostics:: TypeNoCopy :: Label {
280+ is_partial_move,
281+ ty,
282+ place : & note_msg,
283+ span,
284+ } ) ;
282285 } else {
283- None
286+ err. subdiagnostic ( crate :: session_diagnostics:: TypeNoCopy :: Note {
287+ is_partial_move,
288+ ty,
289+ place : & note_msg,
290+ } ) ;
284291 } ;
285- self . note_type_does_not_implement_copy ( & mut err, & note_msg, ty, span, partial_str) ;
286292 }
287293
288294 if let UseSpans :: FnSelfUse {
@@ -836,11 +842,13 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
836842
837843 borrow_spans. var_path_only_subdiag ( & mut err, crate :: InitializationRequiringAction :: Borrow ) ;
838844
839- move_spans. var_span_label (
840- & mut err,
841- format ! ( "move occurs due to use{}" , move_spans. describe( ) ) ,
842- "moved" ,
843- ) ;
845+ move_spans. var_subdiag ( None , & mut err, None , |kind, var_span| {
846+ use crate :: session_diagnostics:: CaptureVarCause :: * ;
847+ match kind {
848+ Some ( _) => MoveUseInGenerator { var_span } ,
849+ None => MoveUseInClosure { var_span } ,
850+ }
851+ } ) ;
844852
845853 self . explain_why_borrow_contains_point ( location, borrow, None )
846854 . add_explanation_to_diagnostic (
@@ -877,13 +885,15 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
877885 borrow_span,
878886 & self . describe_any_place ( borrow. borrowed_place . as_ref ( ) ) ,
879887 ) ;
880- borrow_spans. var_subdiag ( & mut err, Some ( borrow. kind ) , |kind, var_span| {
888+ borrow_spans. var_subdiag ( None , & mut err, Some ( borrow. kind ) , |kind, var_span| {
881889 use crate :: session_diagnostics:: CaptureVarCause :: * ;
882890 let place = & borrow. borrowed_place ;
883891 let desc_place = self . describe_any_place ( place. as_ref ( ) ) ;
884892 match kind {
885- Some ( _) => BorrowUsePlaceGenerator { place : desc_place, var_span } ,
886- None => BorrowUsePlaceClosure { place : desc_place, var_span } ,
893+ Some ( _) => {
894+ BorrowUsePlaceGenerator { place : desc_place, var_span, is_single_var : true }
895+ }
896+ None => BorrowUsePlaceClosure { place : desc_place, var_span, is_single_var : true } ,
887897 }
888898 } ) ;
889899
@@ -991,16 +1001,26 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
9911001 immutable_section_description,
9921002 "mutably borrow" ,
9931003 ) ;
994- borrow_spans. var_span_label (
1004+ borrow_spans. var_subdiag (
1005+ None ,
9951006 & mut err,
996- format ! (
997- "borrow occurs due to use of {}{}" ,
998- desc_place,
999- borrow_spans. describe( ) ,
1000- ) ,
1001- "immutable" ,
1007+ Some ( BorrowKind :: Unique ) ,
1008+ |kind, var_span| {
1009+ use crate :: session_diagnostics:: CaptureVarCause :: * ;
1010+ match kind {
1011+ Some ( _) => BorrowUsePlaceGenerator {
1012+ place : desc_place,
1013+ var_span,
1014+ is_single_var : true ,
1015+ } ,
1016+ None => BorrowUsePlaceClosure {
1017+ place : desc_place,
1018+ var_span,
1019+ is_single_var : true ,
1020+ } ,
1021+ }
1022+ } ,
10021023 ) ;
1003-
10041024 return err;
10051025 } else {
10061026 first_borrow_desc = "immutable " ;
@@ -1073,32 +1093,48 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
10731093 } ;
10741094
10751095 if issued_spans == borrow_spans {
1076- borrow_spans. var_span_label (
1077- & mut err,
1078- format ! ( "borrows occur due to use of {}{}" , desc_place, borrow_spans. describe( ) , ) ,
1079- gen_borrow_kind. describe_mutability ( ) ,
1080- ) ;
1096+ borrow_spans. var_subdiag ( None , & mut err, Some ( gen_borrow_kind) , |kind, var_span| {
1097+ use crate :: session_diagnostics:: CaptureVarCause :: * ;
1098+ match kind {
1099+ Some ( _) => BorrowUsePlaceGenerator {
1100+ place : desc_place,
1101+ var_span,
1102+ is_single_var : false ,
1103+ } ,
1104+ None => {
1105+ BorrowUsePlaceClosure { place : desc_place, var_span, is_single_var : false }
1106+ }
1107+ }
1108+ } ) ;
10811109 } else {
1082- let borrow_place = & issued_borrow. borrowed_place ;
1083- let borrow_place_desc = self . describe_any_place ( borrow_place. as_ref ( ) ) ;
1084- issued_spans. var_span_label (
1110+ issued_spans. var_subdiag (
1111+ Some ( & self . infcx . tcx . sess . parse_sess . span_diagnostic ) ,
10851112 & mut err,
1086- format ! (
1087- "first borrow occurs due to use of {}{}" ,
1088- borrow_place_desc,
1089- issued_spans. describe( ) ,
1090- ) ,
1091- issued_borrow. kind . describe_mutability ( ) ,
1113+ Some ( issued_borrow. kind ) ,
1114+ |kind, var_span| {
1115+ use crate :: session_diagnostics:: CaptureVarCause :: * ;
1116+ let borrow_place = & issued_borrow. borrowed_place ;
1117+ let borrow_place_desc = self . describe_any_place ( borrow_place. as_ref ( ) ) ;
1118+ match kind {
1119+ Some ( _) => {
1120+ FirstBorrowUsePlaceGenerator { place : borrow_place_desc, var_span }
1121+ }
1122+ None => FirstBorrowUsePlaceClosure { place : borrow_place_desc, var_span } ,
1123+ }
1124+ } ,
10921125 ) ;
10931126
1094- borrow_spans. var_span_label (
1127+ borrow_spans. var_subdiag (
1128+ Some ( & self . infcx . tcx . sess . parse_sess . span_diagnostic ) ,
10951129 & mut err,
1096- format ! (
1097- "second borrow occurs due to use of {}{}" ,
1098- desc_place,
1099- borrow_spans. describe( ) ,
1100- ) ,
1101- gen_borrow_kind. describe_mutability ( ) ,
1130+ Some ( gen_borrow_kind) ,
1131+ |kind, var_span| {
1132+ use crate :: session_diagnostics:: CaptureVarCause :: * ;
1133+ match kind {
1134+ Some ( _) => SecondBorrowUsePlaceGenerator { place : desc_place, var_span } ,
1135+ None => SecondBorrowUsePlaceClosure { place : desc_place, var_span } ,
1136+ }
1137+ } ,
11021138 ) ;
11031139 }
11041140
@@ -1572,9 +1608,12 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
15721608 err. span_label ( borrow_span, "borrowed value does not live long enough" ) ;
15731609 err. span_label ( drop_span, format ! ( "`{}` dropped here while still borrowed" , name) ) ;
15741610
1575- let within = if borrow_spans. for_generator ( ) { " by generator" } else { "" } ;
1576-
1577- borrow_spans. args_span_label ( & mut err, format ! ( "value captured here{}" , within) ) ;
1611+ borrow_spans. args_subdiag ( & mut err, |args_span| {
1612+ crate :: session_diagnostics:: CaptureArgLabel :: Capture {
1613+ is_within : borrow_spans. for_generator ( ) ,
1614+ args_span,
1615+ }
1616+ } ) ;
15781617
15791618 explanation. add_explanation_to_diagnostic (
15801619 self . infcx . tcx ,
@@ -1788,9 +1827,12 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
17881827 None ,
17891828 ) ;
17901829
1791- let within = if borrow_spans. for_generator ( ) { " by generator" } else { "" } ;
1792-
1793- borrow_spans. args_span_label ( & mut err, format ! ( "value captured here{}" , within) ) ;
1830+ borrow_spans. args_subdiag ( & mut err, |args_span| {
1831+ crate :: session_diagnostics:: CaptureArgLabel :: Capture {
1832+ is_within : borrow_spans. for_generator ( ) ,
1833+ args_span,
1834+ }
1835+ } ) ;
17941836
17951837 err
17961838 }
@@ -2214,11 +2256,14 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
22142256 section,
22152257 "assign" ,
22162258 ) ;
2217- loan_spans. var_span_label (
2218- & mut err,
2219- format ! ( "borrow occurs due to use{}" , loan_spans. describe( ) ) ,
2220- loan. kind . describe_mutability ( ) ,
2221- ) ;
2259+
2260+ loan_spans. var_subdiag ( None , & mut err, Some ( loan. kind ) , |kind, var_span| {
2261+ use crate :: session_diagnostics:: CaptureVarCause :: * ;
2262+ match kind {
2263+ Some ( _) => BorrowUseInGenerator { var_span } ,
2264+ None => BorrowUseInClosure { var_span } ,
2265+ }
2266+ } ) ;
22222267
22232268 self . buffer_error ( err) ;
22242269
@@ -2228,11 +2273,13 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
22282273
22292274 let mut err = self . cannot_assign_to_borrowed ( span, loan_span, & descr_place) ;
22302275
2231- loan_spans. var_span_label (
2232- & mut err,
2233- format ! ( "borrow occurs due to use{}" , loan_spans. describe( ) ) ,
2234- loan. kind . describe_mutability ( ) ,
2235- ) ;
2276+ loan_spans. var_subdiag ( None , & mut err, Some ( loan. kind ) , |kind, var_span| {
2277+ use crate :: session_diagnostics:: CaptureVarCause :: * ;
2278+ match kind {
2279+ Some ( _) => BorrowUseInGenerator { var_span } ,
2280+ None => BorrowUseInClosure { var_span } ,
2281+ }
2282+ } ) ;
22362283
22372284 self . explain_why_borrow_contains_point ( location, loan, None ) . add_explanation_to_diagnostic (
22382285 self . infcx . tcx ,
0 commit comments