@@ -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: ¬e_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: ¬e_msg,
298
+ });
289
299
};
290
- self.note_type_does_not_implement_copy(&mut err, ¬e_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