@@ -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