Skip to content

Commit 19269fe

Browse files
committed
BLBLinloop
1 parent 877d339 commit 19269fe

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
@@ -177,32 +177,95 @@ pub(crate) enum BorrowUsedLater<'a> {
177177
#[primary_span]
178178
span: Span,
179179
},
180-
181180
#[label(borrowck::borrow_later_captured_by_closure)]
182181
ClosureCapture {
183182
borrow_desc: &'a str,
184183
#[primary_span]
185184
span: Span,
186185
},
187-
188186
#[label(borrowck::borrow_later_used_by_call)]
189187
Call {
190188
borrow_desc: &'a str,
191189
#[primary_span]
192190
span: Span,
193191
},
194-
195192
#[label(borrowck::borrow_later_stored_here)]
196193
FakeLetRead {
197194
borrow_desc: &'a str,
198195
#[primary_span]
199196
span: Span,
200197
},
201-
202198
#[label(borrowck::borrow_later_used_here)]
203199
Other {
204200
borrow_desc: &'a str,
205201
#[primary_span]
206202
span: Span,
207203
},
208204
}
205+
206+
#[derive(SessionSubdiagnostic)]
207+
pub(crate) enum BorrowUsedLaterInLoop<'a> {
208+
#[label(borrowck::trait_capture_borrow_in_later_iteration_loop)]
209+
TraitCapture {
210+
borrow_desc: &'a str,
211+
#[primary_span]
212+
span: Span,
213+
},
214+
#[label(borrowck::closure_capture_borrow_in_later_iteration_loop)]
215+
ClosureCapture {
216+
borrow_desc: &'a str,
217+
#[primary_span]
218+
span: Span,
219+
},
220+
#[label(borrowck::call_used_borrow_in_later_iteration_loop)]
221+
Call {
222+
borrow_desc: &'a str,
223+
#[primary_span]
224+
span: Span,
225+
},
226+
#[label(borrowck::borrow_later_stored_here)]
227+
FakeLetRead {
228+
borrow_desc: &'a str,
229+
#[primary_span]
230+
span: Span,
231+
},
232+
#[label(borrowck::used_borrow_in_later_iteration_loop)]
233+
Other {
234+
borrow_desc: &'a str,
235+
#[primary_span]
236+
span: Span,
237+
},
238+
}
239+
#[derive(SessionSubdiagnostic)]
240+
pub(crate) enum BorrowLaterBorrowUsedLaterInLoop<'a> {
241+
#[label(borrowck::bl_trait_capture_borrow_in_later_iteration_loop)]
242+
TraitCapture {
243+
borrow_desc: &'a str,
244+
#[primary_span]
245+
span: Span,
246+
},
247+
#[label(borrowck::bl_closure_capture_borrow_in_later_iteration_loop)]
248+
ClosureCapture {
249+
borrow_desc: &'a str,
250+
#[primary_span]
251+
span: Span,
252+
},
253+
#[label(borrowck::call_used_borrow_in_later_iteration_loop)]
254+
Call {
255+
borrow_desc: &'a str,
256+
#[primary_span]
257+
span: Span,
258+
},
259+
#[label(borrowck::bl_borrow_later_stored_here)]
260+
FakeLetRead {
261+
borrow_desc: &'a str,
262+
#[primary_span]
263+
span: Span,
264+
},
265+
#[label(borrowck::bl_used_borrow_in_later_iteration_loop)]
266+
Other {
267+
borrow_desc: &'a str,
268+
#[primary_span]
269+
span: Span,
270+
},
271+
}

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

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -78,15 +78,30 @@ borrowck_used_here_by_closure =
7878
used here by closure
7979
8080
borrowck_trait_capture_borrow_in_later_iteration_loop =
81-
{$borrow_desc}borrow later borrow captured here by trait object, in later iteration of loop
81+
{$borrow_desc}borrow captured here by trait object, in later iteration of loop
8282
8383
borrowck_closure_capture_borrow_in_later_iteration_loop =
84-
{$borrow_desc}borrow later borrow captured here by closure, in later iteration of loop
84+
{$borrow_desc}borrow captured here by closure, in later iteration of loop
8585
8686
borrowck_call_used_borrow_in_later_iteration_loop =
87-
{$borrow_desc}borrow later borrow used by call, in later iteration of loop
87+
{$borrow_desc}borrow used by call, in later iteration of loop
8888
8989
borrowck_used_borrow_in_later_iteration_loop =
90+
{$borrow_desc}borrow used here, in later iteration of loop
91+
92+
borrowck_bl_trait_capture_borrow_in_later_iteration_loop =
93+
{$borrow_desc}borrow later borrow captured here by trait object, in later iteration of loop
94+
95+
borrowck_bl_closure_capture_borrow_in_later_iteration_loop =
96+
{$borrow_desc}borrow later borrow captured here by closure, in later iteration of loop
97+
98+
borrowck_bl_call_used_borrow_in_later_iteration_loop =
99+
{$borrow_desc}borrow later borrow used by call, in later iteration of loop
100+
101+
borrowck_bl_borrow_later_stored_here =
102+
{$borrow_desc}borrow later borrow later stored here
103+
104+
borrowck_bl_used_borrow_in_later_iteration_loop =
90105
{$borrow_desc}borrow later borrow used here, in later iteration of loop
91106
92107
borrowck_drop_local_might_cause_borrow =

0 commit comments

Comments
 (0)