Skip to content

Commit 3348c6c

Browse files
committed
BLBLinloop
1 parent 1f346fd commit 3348c6c

File tree

3 files changed

+141
-27
lines changed

3 files changed

+141
-27
lines changed

compiler/rustc_borrowck/src/diagnostics/explain_borrow.rs

Lines changed: 56 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@ use rustc_span::symbol::{kw, Symbol};
1616
use rustc_span::{sym, DesugaringKind, Span};
1717

1818
use crate::region_infer::BlameConstraint;
19-
use crate::session_diagnostics::{BorrowUsedHere, BorrowUsedLater};
19+
use crate::session_diagnostics::{
20+
BorrowLaterBorrowUsedLaterInLoop, BorrowUsedHere, BorrowUsedLater, BorrowUsedLaterInLoop,
21+
};
2022
use crate::{
2123
borrow_set::BorrowData, nll::ConstraintDescription, region_infer::Cause, MirBorrowckCtxt,
2224
WriteKind,
@@ -122,33 +124,67 @@ impl<'tcx> BorrowExplanation<'tcx> {
122124
}
123125
}
124126
BorrowExplanation::UsedLaterInLoop(later_use_kind, var_or_use_span, path_span) => {
125-
let message = match later_use_kind {
126-
LaterUseKind::TraitCapture => {
127-
"borrow captured here by trait object, in later iteration of loop"
128-
}
129-
LaterUseKind::ClosureCapture => {
130-
"borrow captured here by closure, in later iteration of loop"
131-
}
132-
LaterUseKind::Call => "borrow used by call, in later iteration of loop",
133-
LaterUseKind::FakeLetRead => "borrow later stored here",
134-
LaterUseKind::Other => "borrow used here, in later iteration of loop",
135-
};
136127
// We can use `var_or_use_span` if either `path_span` is not present, or both spans are the same
137128
if path_span.map(|path_span| path_span == var_or_use_span).unwrap_or(true) {
138-
err.span_label(var_or_use_span, format!("{}{}", borrow_desc, message));
129+
let sub_err = match later_use_kind {
130+
LaterUseKind::TraitCapture => BorrowUsedLaterInLoop::TraitCapture {
131+
borrow_desc,
132+
span: var_or_use_span,
133+
},
134+
LaterUseKind::ClosureCapture => BorrowUsedLaterInLoop::ClosureCapture {
135+
borrow_desc,
136+
span: var_or_use_span,
137+
},
138+
LaterUseKind::Call => {
139+
BorrowUsedLaterInLoop::Call { borrow_desc, span: var_or_use_span }
140+
}
141+
LaterUseKind::FakeLetRead => BorrowUsedLaterInLoop::FakeLetRead {
142+
borrow_desc,
143+
span: var_or_use_span,
144+
},
145+
LaterUseKind::Other => {
146+
BorrowUsedLaterInLoop::Other { borrow_desc, span: var_or_use_span }
147+
}
148+
};
149+
err.subdiagnostic(sub_err);
150+
// err.span_label(var_or_use_span, format!("{}{}", borrow_desc, message));
139151
} else {
140152
// path_span must be `Some` as otherwise the if condition is true
141153
let path_span = path_span.unwrap();
142154
// path_span is only present in the case of closure capture
143155
assert!(matches!(later_use_kind, LaterUseKind::ClosureCapture));
144156
if borrow_span.map(|sp| !sp.overlaps(var_or_use_span)).unwrap_or(true) {
145-
let path_label = "used here by closure";
146-
let capture_kind_label = message;
147-
err.span_label(
148-
var_or_use_span,
149-
format!("{}borrow later {}", borrow_desc, capture_kind_label),
150-
);
151-
err.span_label(path_span, path_label);
157+
let sub_err = match later_use_kind {
158+
LaterUseKind::TraitCapture => {
159+
BorrowLaterBorrowUsedLaterInLoop::TraitCapture {
160+
borrow_desc,
161+
span: var_or_use_span,
162+
}
163+
}
164+
LaterUseKind::ClosureCapture => {
165+
BorrowLaterBorrowUsedLaterInLoop::ClosureCapture {
166+
borrow_desc,
167+
span: var_or_use_span,
168+
}
169+
}
170+
LaterUseKind::Call => BorrowLaterBorrowUsedLaterInLoop::Call {
171+
borrow_desc,
172+
span: var_or_use_span,
173+
},
174+
LaterUseKind::FakeLetRead => {
175+
BorrowLaterBorrowUsedLaterInLoop::FakeLetRead {
176+
borrow_desc,
177+
span: var_or_use_span,
178+
}
179+
}
180+
LaterUseKind::Other => BorrowLaterBorrowUsedLaterInLoop::Other {
181+
borrow_desc,
182+
span: var_or_use_span,
183+
},
184+
};
185+
err.subdiagnostic(sub_err);
186+
let sub_label = BorrowUsedHere::ByClosure { path_span };
187+
err.subdiagnostic(sub_label);
152188
}
153189
}
154190
}

compiler/rustc_borrowck/src/session_diagnostics.rs

Lines changed: 67 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -193,32 +193,95 @@ pub(crate) enum BorrowUsedLater<'a> {
193193
#[primary_span]
194194
span: Span,
195195
},
196-
197196
#[label(borrowck::borrow_later_captured_by_closure)]
198197
ClosureCapture {
199198
borrow_desc: &'a str,
200199
#[primary_span]
201200
span: Span,
202201
},
203-
204202
#[label(borrowck::borrow_later_used_by_call)]
205203
Call {
206204
borrow_desc: &'a str,
207205
#[primary_span]
208206
span: Span,
209207
},
210-
211208
#[label(borrowck::borrow_later_stored_here)]
212209
FakeLetRead {
213210
borrow_desc: &'a str,
214211
#[primary_span]
215212
span: Span,
216213
},
217-
218214
#[label(borrowck::borrow_later_used_here)]
219215
Other {
220216
borrow_desc: &'a str,
221217
#[primary_span]
222218
span: Span,
223219
},
224220
}
221+
222+
#[derive(SessionSubdiagnostic)]
223+
pub(crate) enum BorrowUsedLaterInLoop<'a> {
224+
#[label(borrowck::trait_capture_borrow_in_later_iteration_loop)]
225+
TraitCapture {
226+
borrow_desc: &'a str,
227+
#[primary_span]
228+
span: Span,
229+
},
230+
#[label(borrowck::closure_capture_borrow_in_later_iteration_loop)]
231+
ClosureCapture {
232+
borrow_desc: &'a str,
233+
#[primary_span]
234+
span: Span,
235+
},
236+
#[label(borrowck::call_used_borrow_in_later_iteration_loop)]
237+
Call {
238+
borrow_desc: &'a str,
239+
#[primary_span]
240+
span: Span,
241+
},
242+
#[label(borrowck::borrow_later_stored_here)]
243+
FakeLetRead {
244+
borrow_desc: &'a str,
245+
#[primary_span]
246+
span: Span,
247+
},
248+
#[label(borrowck::used_borrow_in_later_iteration_loop)]
249+
Other {
250+
borrow_desc: &'a str,
251+
#[primary_span]
252+
span: Span,
253+
},
254+
}
255+
#[derive(SessionSubdiagnostic)]
256+
pub(crate) enum BorrowLaterBorrowUsedLaterInLoop<'a> {
257+
#[label(borrowck::bl_trait_capture_borrow_in_later_iteration_loop)]
258+
TraitCapture {
259+
borrow_desc: &'a str,
260+
#[primary_span]
261+
span: Span,
262+
},
263+
#[label(borrowck::bl_closure_capture_borrow_in_later_iteration_loop)]
264+
ClosureCapture {
265+
borrow_desc: &'a str,
266+
#[primary_span]
267+
span: Span,
268+
},
269+
#[label(borrowck::call_used_borrow_in_later_iteration_loop)]
270+
Call {
271+
borrow_desc: &'a str,
272+
#[primary_span]
273+
span: Span,
274+
},
275+
#[label(borrowck::bl_borrow_later_stored_here)]
276+
FakeLetRead {
277+
borrow_desc: &'a str,
278+
#[primary_span]
279+
span: Span,
280+
},
281+
#[label(borrowck::bl_used_borrow_in_later_iteration_loop)]
282+
Other {
283+
borrow_desc: &'a str,
284+
#[primary_span]
285+
span: Span,
286+
},
287+
}

compiler/rustc_error_messages/locales/en-US/borrowck.ftl

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -86,15 +86,30 @@ borrowck_used_here_by_closure =
8686
used here by closure
8787
8888
borrowck_trait_capture_borrow_in_later_iteration_loop =
89-
{$borrow_desc}borrow later borrow captured here by trait object, in later iteration of loop
89+
{$borrow_desc}borrow captured here by trait object, in later iteration of loop
9090
9191
borrowck_closure_capture_borrow_in_later_iteration_loop =
92-
{$borrow_desc}borrow later borrow captured here by closure, in later iteration of loop
92+
{$borrow_desc}borrow captured here by closure, in later iteration of loop
9393
9494
borrowck_call_used_borrow_in_later_iteration_loop =
95-
{$borrow_desc}borrow later borrow used by call, in later iteration of loop
95+
{$borrow_desc}borrow used by call, in later iteration of loop
9696
9797
borrowck_used_borrow_in_later_iteration_loop =
98+
{$borrow_desc}borrow used here, in later iteration of loop
99+
100+
borrowck_bl_trait_capture_borrow_in_later_iteration_loop =
101+
{$borrow_desc}borrow later borrow captured here by trait object, in later iteration of loop
102+
103+
borrowck_bl_closure_capture_borrow_in_later_iteration_loop =
104+
{$borrow_desc}borrow later borrow captured here by closure, in later iteration of loop
105+
106+
borrowck_bl_call_used_borrow_in_later_iteration_loop =
107+
{$borrow_desc}borrow later borrow used by call, in later iteration of loop
108+
109+
borrowck_bl_borrow_later_stored_here =
110+
{$borrow_desc}borrow later borrow later stored here
111+
112+
borrowck_bl_used_borrow_in_later_iteration_loop =
98113
{$borrow_desc}borrow later borrow used here, in later iteration of loop
99114
100115
borrowck_drop_local_might_cause_borrow =

0 commit comments

Comments
 (0)