@@ -30,8 +30,8 @@ use crate::borrow_set::TwoPhaseActivation;
30
30
use crate :: borrowck_errors;
31
31
32
32
use crate :: diagnostics:: conflict_errors:: StorageDeadOrDrop :: LocalStorageDead ;
33
- use crate :: diagnostics:: find_all_local_uses;
34
33
use crate :: diagnostics:: mutability_errors:: mut_borrow_of_mutable_ref;
34
+ use crate :: diagnostics:: { find_all_local_uses, CapturedMessageOpt } ;
35
35
use crate :: {
36
36
borrow_set:: BorrowData , diagnostics:: Instance , prefixes:: IsPrefixOf ,
37
37
InitializationRequiringAction , MirBorrowckCtxt , PrefixSet , WriteKind ,
@@ -183,13 +183,9 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
183
183
let move_spans = self . move_spans ( moved_place. as_ref ( ) , move_out. source ) ;
184
184
let move_span = move_spans. args_or_use ( ) ;
185
185
186
- let move_msg = if move_spans. for_closure ( ) { " into closure" } else { "" } ;
186
+ let is_move_msg = move_spans. for_closure ( ) ;
187
187
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 ;
193
189
194
190
if location == move_out. source {
195
191
is_loop_move = true ;
@@ -206,17 +202,21 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
206
202
) ;
207
203
}
208
204
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
+ } ;
209
213
self . explain_captures (
210
214
& mut err,
211
215
span,
212
216
move_span,
213
217
move_spans,
214
218
* moved_place,
215
- partially_str,
216
- loop_message,
217
- move_msg,
218
- is_loop_move,
219
- maybe_reinitialized_locations. is_empty ( ) ,
219
+ msg_opt,
220
220
) ;
221
221
}
222
222
seen_spans. insert ( move_span) ;
@@ -282,12 +282,21 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
282
282
}
283
283
284
284
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
+ } ) ;
287
293
} else {
288
- None
294
+ err. subdiagnostic ( crate :: session_diagnostics:: TypeNoCopy :: Note {
295
+ is_partial_move,
296
+ ty,
297
+ place : & note_msg,
298
+ } ) ;
289
299
} ;
290
- self . note_type_does_not_implement_copy ( & mut err, & note_msg, ty, span, partial_str) ;
291
300
}
292
301
293
302
if let UseSpans :: FnSelfUse {
@@ -827,11 +836,13 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
827
836
828
837
borrow_spans. var_path_only_subdiag ( & mut err, crate :: InitializationRequiringAction :: Borrow ) ;
829
838
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
+ } ) ;
835
846
836
847
self . explain_why_borrow_contains_point ( location, borrow, None )
837
848
. add_explanation_to_diagnostic (
@@ -868,13 +879,15 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
868
879
borrow_span,
869
880
& self . describe_any_place ( borrow. borrowed_place . as_ref ( ) ) ,
870
881
) ;
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| {
872
883
use crate :: session_diagnostics:: CaptureVarCause :: * ;
873
884
let place = & borrow. borrowed_place ;
874
885
let desc_place = self . describe_any_place ( place. as_ref ( ) ) ;
875
886
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 } ,
878
891
}
879
892
} ) ;
880
893
@@ -988,16 +1001,26 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
988
1001
immutable_section_description,
989
1002
"mutably borrow" ,
990
1003
) ;
991
- borrow_spans. var_span_label (
1004
+ borrow_spans. var_subdiag (
1005
+ None ,
992
1006
& 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
+ } ,
999
1023
) ;
1000
-
1001
1024
return err;
1002
1025
} else {
1003
1026
first_borrow_desc = "immutable " ;
@@ -1070,32 +1093,48 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
1070
1093
} ;
1071
1094
1072
1095
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
+ } ) ;
1078
1109
} 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 ) ,
1082
1112
& 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
+ } ,
1089
1125
) ;
1090
1126
1091
- borrow_spans. var_span_label (
1127
+ borrow_spans. var_subdiag (
1128
+ Some ( & self . infcx . tcx . sess . parse_sess . span_diagnostic ) ,
1092
1129
& 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
+ } ,
1099
1138
) ;
1100
1139
}
1101
1140
@@ -1731,9 +1770,12 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
1731
1770
err. span_label ( borrow_span, "borrowed value does not live long enough" ) ;
1732
1771
err. span_label ( drop_span, format ! ( "`{}` dropped here while still borrowed" , name) ) ;
1733
1772
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
+ } ) ;
1737
1779
1738
1780
explanation. add_explanation_to_diagnostic (
1739
1781
self . infcx . tcx ,
@@ -1947,9 +1989,12 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
1947
1989
None ,
1948
1990
) ;
1949
1991
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
+ } ) ;
1953
1998
1954
1999
err
1955
2000
}
@@ -2382,11 +2427,14 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
2382
2427
section,
2383
2428
"assign" ,
2384
2429
) ;
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
+ } ) ;
2390
2438
2391
2439
self . buffer_error ( err) ;
2392
2440
@@ -2396,11 +2444,13 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
2396
2444
2397
2445
let mut err = self . cannot_assign_to_borrowed ( span, loan_span, & descr_place) ;
2398
2446
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
+ } ) ;
2404
2454
2405
2455
self . explain_why_borrow_contains_point ( location, loan, None ) . add_explanation_to_diagnostic (
2406
2456
self . infcx . tcx ,
0 commit comments