@@ -30,8 +30,8 @@ use crate::borrow_set::TwoPhaseActivation;
3030use crate :: borrowck_errors;
3131
3232use crate :: diagnostics:: conflict_errors:: StorageDeadOrDrop :: LocalStorageDead ;
33- use crate :: diagnostics:: find_all_local_uses;
3433use crate :: diagnostics:: mutability_errors:: mut_borrow_of_mutable_ref;
34+ use crate :: diagnostics:: { find_all_local_uses, CapturedMessageOpt } ;
3535use crate :: {
3636 borrow_set:: BorrowData , diagnostics:: Instance , prefixes:: IsPrefixOf ,
3737 InitializationRequiringAction , MirBorrowckCtxt , PrefixSet , WriteKind ,
@@ -183,13 +183,9 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
183183 let move_spans = self . move_spans ( moved_place. as_ref ( ) , move_out. source ) ;
184184 let move_span = move_spans. args_or_use ( ) ;
185185
186- let move_msg = if move_spans. for_closure ( ) { " into closure" } else { "" } ;
186+ let is_move_msg = move_spans. for_closure ( ) ;
187187
188- let loop_message = if location == move_out. source || move_site. traversed_back_edge {
189- ", in previous iteration of loop"
190- } else {
191- ""
192- } ;
188+ let is_loop_message = location == move_out. source || move_site. traversed_back_edge ;
193189
194190 if location == move_out. source {
195191 is_loop_move = true ;
@@ -206,17 +202,21 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
206202 ) ;
207203 }
208204
205+ let msg_opt = CapturedMessageOpt {
206+ is_partial_move,
207+ is_loop_message,
208+ is_move_msg,
209+ is_loop_move,
210+ maybe_reinitialized_locations_is_empty : maybe_reinitialized_locations
211+ . is_empty ( ) ,
212+ } ;
209213 self . explain_captures (
210214 & mut err,
211215 span,
212216 move_span,
213217 move_spans,
214218 * moved_place,
215- partially_str,
216- loop_message,
217- move_msg,
218- is_loop_move,
219- maybe_reinitialized_locations. is_empty ( ) ,
219+ msg_opt,
220220 ) ;
221221 }
222222 seen_spans. insert ( move_span) ;
@@ -282,12 +282,21 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
282282 }
283283
284284 if needs_note {
285- let span = if let Some ( local) = place. as_local ( ) {
286- Some ( self . body . local_decls [ local] . source_info . span )
285+ if let Some ( local) = place. as_local ( ) {
286+ let span = self . body . local_decls [ local] . source_info . span ;
287+ err. subdiagnostic ( crate :: session_diagnostics:: TypeNoCopy :: Label {
288+ is_partial_move,
289+ ty,
290+ place : & note_msg,
291+ span,
292+ } ) ;
287293 } else {
288- None
294+ err. subdiagnostic ( crate :: session_diagnostics:: TypeNoCopy :: Note {
295+ is_partial_move,
296+ ty,
297+ place : & note_msg,
298+ } ) ;
289299 } ;
290- self . note_type_does_not_implement_copy ( & mut err, & note_msg, ty, span, partial_str) ;
291300 }
292301
293302 if let UseSpans :: FnSelfUse {
@@ -827,11 +836,13 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
827836
828837 borrow_spans. var_path_only_subdiag ( & mut err, crate :: InitializationRequiringAction :: Borrow ) ;
829838
830- move_spans. var_span_label (
831- & mut err,
832- format ! ( "move occurs due to use{}" , move_spans. describe( ) ) ,
833- "moved" ,
834- ) ;
839+ move_spans. var_subdiag ( None , & mut err, None , |kind, var_span| {
840+ use crate :: session_diagnostics:: CaptureVarCause :: * ;
841+ match kind {
842+ Some ( _) => MoveUseInGenerator { var_span } ,
843+ None => MoveUseInClosure { var_span } ,
844+ }
845+ } ) ;
835846
836847 self . explain_why_borrow_contains_point ( location, borrow, None )
837848 . add_explanation_to_diagnostic (
@@ -868,13 +879,15 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
868879 borrow_span,
869880 & self . describe_any_place ( borrow. borrowed_place . as_ref ( ) ) ,
870881 ) ;
871- borrow_spans. var_subdiag ( & mut err, Some ( borrow. kind ) , |kind, var_span| {
882+ borrow_spans. var_subdiag ( None , & mut err, Some ( borrow. kind ) , |kind, var_span| {
872883 use crate :: session_diagnostics:: CaptureVarCause :: * ;
873884 let place = & borrow. borrowed_place ;
874885 let desc_place = self . describe_any_place ( place. as_ref ( ) ) ;
875886 match kind {
876- Some ( _) => BorrowUsePlaceGenerator { place : desc_place, var_span } ,
877- None => BorrowUsePlaceClosure { place : desc_place, var_span } ,
887+ Some ( _) => {
888+ BorrowUsePlaceGenerator { place : desc_place, var_span, is_single_var : true }
889+ }
890+ None => BorrowUsePlaceClosure { place : desc_place, var_span, is_single_var : true } ,
878891 }
879892 } ) ;
880893
@@ -988,16 +1001,26 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
9881001 immutable_section_description,
9891002 "mutably borrow" ,
9901003 ) ;
991- borrow_spans. var_span_label (
1004+ borrow_spans. var_subdiag (
1005+ None ,
9921006 & mut err,
993- format ! (
994- "borrow occurs due to use of {}{}" ,
995- desc_place,
996- borrow_spans. describe( ) ,
997- ) ,
998- "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+ } ,
9991023 ) ;
1000-
10011024 return err;
10021025 } else {
10031026 first_borrow_desc = "immutable " ;
@@ -1070,32 +1093,48 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
10701093 } ;
10711094
10721095 if issued_spans == borrow_spans {
1073- borrow_spans. var_span_label (
1074- & mut err,
1075- format ! ( "borrows occur due to use of {}{}" , desc_place, borrow_spans. describe( ) , ) ,
1076- gen_borrow_kind. describe_mutability ( ) ,
1077- ) ;
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+ } ) ;
10781109 } else {
1079- let borrow_place = & issued_borrow. borrowed_place ;
1080- let borrow_place_desc = self . describe_any_place ( borrow_place. as_ref ( ) ) ;
1081- issued_spans. var_span_label (
1110+ issued_spans. var_subdiag (
1111+ Some ( & self . infcx . tcx . sess . parse_sess . span_diagnostic ) ,
10821112 & mut err,
1083- format ! (
1084- "first borrow occurs due to use of {}{}" ,
1085- borrow_place_desc,
1086- issued_spans. describe( ) ,
1087- ) ,
1088- 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+ } ,
10891125 ) ;
10901126
1091- borrow_spans. var_span_label (
1127+ borrow_spans. var_subdiag (
1128+ Some ( & self . infcx . tcx . sess . parse_sess . span_diagnostic ) ,
10921129 & mut err,
1093- format ! (
1094- "second borrow occurs due to use of {}{}" ,
1095- desc_place,
1096- borrow_spans. describe( ) ,
1097- ) ,
1098- 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+ } ,
10991138 ) ;
11001139 }
11011140
@@ -1731,9 +1770,12 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
17311770 err. span_label ( borrow_span, "borrowed value does not live long enough" ) ;
17321771 err. span_label ( drop_span, format ! ( "`{}` dropped here while still borrowed" , name) ) ;
17331772
1734- let within = if borrow_spans. for_generator ( ) { " by generator" } else { "" } ;
1735-
1736- borrow_spans. args_span_label ( & mut err, format ! ( "value captured here{}" , within) ) ;
1773+ borrow_spans. args_subdiag ( & mut err, |args_span| {
1774+ crate :: session_diagnostics:: CaptureArgLabel :: Capture {
1775+ is_within : borrow_spans. for_generator ( ) ,
1776+ args_span,
1777+ }
1778+ } ) ;
17371779
17381780 explanation. add_explanation_to_diagnostic (
17391781 self . infcx . tcx ,
@@ -1947,9 +1989,12 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
19471989 None ,
19481990 ) ;
19491991
1950- let within = if borrow_spans. for_generator ( ) { " by generator" } else { "" } ;
1951-
1952- borrow_spans. args_span_label ( & mut err, format ! ( "value captured here{}" , within) ) ;
1992+ borrow_spans. args_subdiag ( & mut err, |args_span| {
1993+ crate :: session_diagnostics:: CaptureArgLabel :: Capture {
1994+ is_within : borrow_spans. for_generator ( ) ,
1995+ args_span,
1996+ }
1997+ } ) ;
19531998
19541999 err
19552000 }
@@ -2382,11 +2427,14 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
23822427 section,
23832428 "assign" ,
23842429 ) ;
2385- loan_spans. var_span_label (
2386- & mut err,
2387- format ! ( "borrow occurs due to use{}" , loan_spans. describe( ) ) ,
2388- loan. kind . describe_mutability ( ) ,
2389- ) ;
2430+
2431+ loan_spans. var_subdiag ( None , & mut err, Some ( loan. kind ) , |kind, var_span| {
2432+ use crate :: session_diagnostics:: CaptureVarCause :: * ;
2433+ match kind {
2434+ Some ( _) => BorrowUseInGenerator { var_span } ,
2435+ None => BorrowUseInClosure { var_span } ,
2436+ }
2437+ } ) ;
23902438
23912439 self . buffer_error ( err) ;
23922440
@@ -2396,11 +2444,13 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
23962444
23972445 let mut err = self . cannot_assign_to_borrowed ( span, loan_span, & descr_place) ;
23982446
2399- loan_spans. var_span_label (
2400- & mut err,
2401- format ! ( "borrow occurs due to use{}" , loan_spans. describe( ) ) ,
2402- loan. kind . describe_mutability ( ) ,
2403- ) ;
2447+ loan_spans. var_subdiag ( None , & mut err, Some ( loan. kind ) , |kind, var_span| {
2448+ use crate :: session_diagnostics:: CaptureVarCause :: * ;
2449+ match kind {
2450+ Some ( _) => BorrowUseInGenerator { var_span } ,
2451+ None => BorrowUseInClosure { var_span } ,
2452+ }
2453+ } ) ;
24042454
24052455 self . explain_why_borrow_contains_point ( location, loan, None ) . add_explanation_to_diagnostic (
24062456 self . infcx . tcx ,
0 commit comments