@@ -127,6 +127,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
127
127
&& used_place. is_prefix_of ( moved_place. as_ref ( ) )
128
128
} ) ;
129
129
130
+ //FIXME: move to ftl
130
131
let partial_str = if is_partial_move { "partial " } else { "" } ;
131
132
let partially_str = if is_partial_move { "partially " } else { "" } ;
132
133
@@ -180,13 +181,9 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
180
181
let move_spans = self . move_spans ( moved_place. as_ref ( ) , move_out. source ) ;
181
182
let move_span = move_spans. args_or_use ( ) ;
182
183
183
- let move_msg = if move_spans. for_closure ( ) { " into closure" } else { "" } ;
184
+ let is_move_msg = move_spans. for_closure ( ) ;
184
185
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 ;
190
187
191
188
if location == move_out. source {
192
189
is_loop_move = true ;
@@ -203,9 +200,9 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
203
200
move_span,
204
201
move_spans,
205
202
* moved_place,
206
- partially_str ,
207
- loop_message ,
208
- move_msg ,
203
+ is_partial_move ,
204
+ is_loop_message ,
205
+ is_move_msg ,
209
206
is_loop_move,
210
207
maybe_reinitialized_locations. is_empty ( ) ,
211
208
) ;
@@ -277,12 +274,21 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
277
274
}
278
275
279
276
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
+ } ) ;
282
285
} else {
283
- None
286
+ err. subdiagnostic ( crate :: session_diagnostics:: TypeNoCopy :: Note {
287
+ is_partial_move,
288
+ ty,
289
+ place : & note_msg,
290
+ } ) ;
284
291
} ;
285
- self . note_type_does_not_implement_copy ( & mut err, & note_msg, ty, span, partial_str) ;
286
292
}
287
293
288
294
if let UseSpans :: FnSelfUse {
@@ -836,11 +842,13 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
836
842
837
843
borrow_spans. var_path_only_subdiag ( & mut err, crate :: InitializationRequiringAction :: Borrow ) ;
838
844
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
+ } ) ;
844
852
845
853
self . explain_why_borrow_contains_point ( location, borrow, None )
846
854
. add_explanation_to_diagnostic (
@@ -877,13 +885,15 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
877
885
borrow_span,
878
886
& self . describe_any_place ( borrow. borrowed_place . as_ref ( ) ) ,
879
887
) ;
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| {
881
889
use crate :: session_diagnostics:: CaptureVarCause :: * ;
882
890
let place = & borrow. borrowed_place ;
883
891
let desc_place = self . describe_any_place ( place. as_ref ( ) ) ;
884
892
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 } ,
887
897
}
888
898
} ) ;
889
899
@@ -991,16 +1001,26 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
991
1001
immutable_section_description,
992
1002
"mutably borrow" ,
993
1003
) ;
994
- borrow_spans. var_span_label (
1004
+ borrow_spans. var_subdiag (
1005
+ None ,
995
1006
& 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
+ } ,
1002
1023
) ;
1003
-
1004
1024
return err;
1005
1025
} else {
1006
1026
first_borrow_desc = "immutable " ;
@@ -1073,32 +1093,48 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
1073
1093
} ;
1074
1094
1075
1095
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
+ } ) ;
1081
1109
} 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 ) ,
1085
1112
& 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
+ } ,
1092
1125
) ;
1093
1126
1094
- borrow_spans. var_span_label (
1127
+ borrow_spans. var_subdiag (
1128
+ Some ( & self . infcx . tcx . sess . parse_sess . span_diagnostic ) ,
1095
1129
& 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
+ } ,
1102
1138
) ;
1103
1139
}
1104
1140
@@ -1572,9 +1608,12 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
1572
1608
err. span_label ( borrow_span, "borrowed value does not live long enough" ) ;
1573
1609
err. span_label ( drop_span, format ! ( "`{}` dropped here while still borrowed" , name) ) ;
1574
1610
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
+ } ) ;
1578
1617
1579
1618
explanation. add_explanation_to_diagnostic (
1580
1619
self . infcx . tcx ,
@@ -1788,9 +1827,12 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
1788
1827
None ,
1789
1828
) ;
1790
1829
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
+ } ) ;
1794
1836
1795
1837
err
1796
1838
}
@@ -2214,11 +2256,14 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
2214
2256
section,
2215
2257
"assign" ,
2216
2258
) ;
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
+ } ) ;
2222
2267
2223
2268
self . buffer_error ( err) ;
2224
2269
@@ -2228,11 +2273,13 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
2228
2273
2229
2274
let mut err = self . cannot_assign_to_borrowed ( span, loan_span, & descr_place) ;
2230
2275
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
+ } ) ;
2236
2283
2237
2284
self . explain_why_borrow_contains_point ( location, loan, None ) . add_explanation_to_diagnostic (
2238
2285
self . infcx . tcx ,
0 commit comments