Skip to content

Commit 75c0c8c

Browse files
committed
Avoid cloning Place in describe_place_for_conflicting_borrow
1 parent 46f81fc commit 75c0c8c

File tree

5 files changed

+42
-37
lines changed

5 files changed

+42
-37
lines changed

src/librustc_mir/borrow_check/conflict_errors.rs

Lines changed: 26 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -275,11 +275,11 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
275275
"report_move_out_while_borrowed: location={:?} place={:?} span={:?} borrow={:?}",
276276
location, place, span, borrow
277277
);
278-
let value_msg = match self.describe_place(place) {
278+
let value_msg = match self.describe_place(place.as_place_ref()) {
279279
Some(name) => format!("`{}`", name),
280280
None => "value".to_owned(),
281281
};
282-
let borrow_msg = match self.describe_place(&borrow.borrowed_place) {
282+
let borrow_msg = match self.describe_place(borrow.borrowed_place.as_place_ref()) {
283283
Some(name) => format!("`{}`", name),
284284
None => "value".to_owned(),
285285
};
@@ -292,7 +292,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
292292

293293
let mut err = self.cannot_move_when_borrowed(
294294
span,
295-
&self.describe_place(place).unwrap_or_else(|| "_".to_owned()),
295+
&self.describe_place(place.as_place_ref()).unwrap_or_else(|| "_".to_owned()),
296296
);
297297
err.span_label(borrow_span, format!("borrow of {} occurs here", borrow_msg));
298298
err.span_label(span, format!("move out of {} occurs here", value_msg));
@@ -331,15 +331,16 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
331331

332332
let mut err = self.cannot_use_when_mutably_borrowed(
333333
span,
334-
&self.describe_place(place).unwrap_or_else(|| "_".to_owned()),
334+
&self.describe_place(place.as_place_ref()).unwrap_or_else(|| "_".to_owned()),
335335
borrow_span,
336-
&self.describe_place(&borrow.borrowed_place)
336+
&self.describe_place(borrow.borrowed_place.as_place_ref())
337337
.unwrap_or_else(|| "_".to_owned()),
338338
);
339339

340340
borrow_spans.var_span_label(&mut err, {
341341
let place = &borrow.borrowed_place;
342-
let desc_place = self.describe_place(place).unwrap_or_else(|| "_".to_owned());
342+
let desc_place =
343+
self.describe_place(place.as_place_ref()).unwrap_or_else(|| "_".to_owned());
343344

344345
format!("borrow occurs due to use of `{}`{}", desc_place, borrow_spans.describe())
345346
});
@@ -516,7 +517,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
516517
);
517518
} else {
518519
let borrow_place = &issued_borrow.borrowed_place;
519-
let borrow_place_desc = self.describe_place(borrow_place)
520+
let borrow_place_desc = self.describe_place(borrow_place.as_place_ref())
520521
.unwrap_or_else(|| "_".to_owned());
521522
issued_spans.var_span_label(
522523
&mut err,
@@ -615,9 +616,9 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
615616
while let Some(box Projection { base: base_proj, elem }) = current {
616617
match elem {
617618
ProjectionElem::Field(field, _) if union_ty(base, base_proj).is_some() => {
618-
return Some((Place {
619-
base: base.clone(),
620-
projection: base_proj.clone(),
619+
return Some((PlaceRef {
620+
base: base,
621+
projection: base_proj,
621622
}, field));
622623
},
623624
_ => current = base_proj,
@@ -639,18 +640,18 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
639640
if let ProjectionElem::Field(field, _) = elem {
640641
if let Some(union_ty) = union_ty(base, proj_base) {
641642
if field != target_field
642-
&& *base == target_base.base
643-
&& *proj_base == target_base.projection {
643+
&& base == target_base.base
644+
&& proj_base == target_base.projection {
644645
// FIXME when we avoid clone reuse describe_place closure
645-
let describe_base_place = self.describe_place(&Place {
646-
base: base.clone(),
647-
projection: proj_base.clone(),
646+
let describe_base_place = self.describe_place(PlaceRef {
647+
base: base,
648+
projection: proj_base,
648649
}).unwrap_or_else(|| "_".to_owned());
649650

650651
return Some((
651652
describe_base_place,
652-
describe_place(first_borrowed_place),
653-
describe_place(second_borrowed_place),
653+
describe_place(first_borrowed_place.as_place_ref()),
654+
describe_place(second_borrowed_place.as_place_ref()),
654655
union_ty.to_string(),
655656
));
656657
}
@@ -665,7 +666,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
665666
// If we didn't find a field access into a union, or both places match, then
666667
// only return the description of the first place.
667668
(
668-
describe_place(first_borrowed_place),
669+
describe_place(first_borrowed_place.as_place_ref()),
669670
"".to_string(),
670671
"".to_string(),
671672
"".to_string(),
@@ -743,7 +744,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
743744
}
744745
}
745746

746-
let place_desc = self.describe_place(&borrow.borrowed_place);
747+
let place_desc = self.describe_place(borrow.borrowed_place.as_place_ref());
747748

748749
let kind_place = kind.filter(|_| place_desc.is_some()).map(|k| (k, place_span.0));
749750
let explanation = self.explain_why_borrow_contains_point(location, &borrow, kind_place);
@@ -950,12 +951,12 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
950951

951952
let mut err = self.cannot_borrow_across_destructor(borrow_span);
952953

953-
let what_was_dropped = match self.describe_place(place) {
954+
let what_was_dropped = match self.describe_place(place.as_place_ref()) {
954955
Some(name) => format!("`{}`", name.as_str()),
955956
None => String::from("temporary value"),
956957
};
957958

958-
let label = match self.describe_place(&borrow.borrowed_place) {
959+
let label = match self.describe_place(borrow.borrowed_place.as_place_ref()) {
959960
Some(borrowed) => format!(
960961
"here, drop of {D} needs exclusive access to `{B}`, \
961962
because the type `{T}` implements the `Drop` trait",
@@ -1389,7 +1390,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
13891390
let mut err = self.cannot_mutate_in_match_guard(
13901391
span,
13911392
loan_span,
1392-
&self.describe_place(place).unwrap_or_else(|| "_".to_owned()),
1393+
&self.describe_place(place.as_place_ref()).unwrap_or_else(|| "_".to_owned()),
13931394
"assign",
13941395
);
13951396
loan_spans.var_span_label(
@@ -1405,7 +1406,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
14051406
let mut err = self.cannot_assign_to_borrowed(
14061407
span,
14071408
loan_span,
1408-
&self.describe_place(place).unwrap_or_else(|| "_".to_owned()),
1409+
&self.describe_place(place.as_place_ref()).unwrap_or_else(|| "_".to_owned()),
14091410
);
14101411

14111412
loan_spans.var_span_label(
@@ -1465,8 +1466,8 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
14651466
is_user_variable: None,
14661467
..
14671468
})
1468-
| None => (self.describe_place(place), assigned_span),
1469-
Some(decl) => (self.describe_place(err_place), decl.source_info.span),
1469+
| None => (self.describe_place(place.as_place_ref()), assigned_span),
1470+
Some(decl) => (self.describe_place(err_place.as_place_ref()), decl.source_info.span),
14701471
};
14711472

14721473
let mut err = self.cannot_reassign_immutable(

src/librustc_mir/borrow_check/error_reporting.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,8 +121,8 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
121121

122122
/// End-user visible description of `place` if one can be found. If the
123123
/// place is a temporary for instance, None will be returned.
124-
pub(super) fn describe_place(&self, place: &Place<'tcx>) -> Option<String> {
125-
self.describe_place_with_options(place.as_place_ref(), IncludingDowncast(false))
124+
pub(super) fn describe_place(&self, place_ref: PlaceRef<'cx, 'tcx>) -> Option<String> {
125+
self.describe_place_with_options(place_ref, IncludingDowncast(false))
126126
}
127127

128128
/// End-user visible description of `place` if one can be found. If the

src/librustc_mir/borrow_check/move_errors.rs

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
277277
span: Span
278278
) -> DiagnosticBuilder<'a> {
279279
let description = if place.projection.is_none() {
280-
format!("static item `{}`", self.describe_place(place).unwrap())
280+
format!("static item `{}`", self.describe_place(place.as_place_ref()).unwrap())
281281
} else {
282282
let mut base_static = &place.projection;
283283
while let Some(box Projection { base: Some(ref proj), .. }) = base_static {
@@ -290,8 +290,8 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
290290

291291
format!(
292292
"`{:?}` as `{:?}` is a static item",
293-
self.describe_place(place).unwrap(),
294-
self.describe_place(&base_static).unwrap(),
293+
self.describe_place(place.as_place_ref()).unwrap(),
294+
self.describe_place(base_static.as_place_ref()).unwrap(),
295295
)
296296
};
297297

@@ -363,7 +363,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
363363
let upvar_name = upvar.name;
364364
let upvar_span = self.infcx.tcx.hir().span(upvar_hir_id);
365365

366-
let place_name = self.describe_place(move_place).unwrap();
366+
let place_name = self.describe_place(move_place.as_place_ref()).unwrap();
367367

368368
let place_description = if self
369369
.is_upvar_field_projection(move_place.as_place_ref())
@@ -392,7 +392,10 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
392392
}
393393
_ => {
394394
let source = self.borrowed_content_source(&deref_base);
395-
match (self.describe_place(move_place), source.describe_for_named_place()) {
395+
match (
396+
self.describe_place(move_place.as_place_ref()),
397+
source.describe_for_named_place(),
398+
) {
396399
(Some(place_desc), Some(source_desc)) => {
397400
self.cannot_move_out_of(
398401
span,
@@ -452,7 +455,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
452455

453456
if binds_to.is_empty() {
454457
let place_ty = move_from.ty(self.body, self.infcx.tcx).ty;
455-
let place_desc = match self.describe_place(&move_from) {
458+
let place_desc = match self.describe_place(move_from.as_place_ref()) {
456459
Some(desc) => format!("`{}`", desc),
457460
None => format!("value"),
458461
};
@@ -480,7 +483,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
480483
GroupedMoveError::OtherIllegalMove { ref original_path, use_spans, .. } => {
481484
let span = use_spans.var_or_use();
482485
let place_ty = original_path.ty(self.body, self.infcx.tcx).ty;
483-
let place_desc = match self.describe_place(original_path) {
486+
let place_desc = match self.describe_place(original_path.as_place_ref()) {
484487
Some(desc) => format!("`{}`", desc),
485488
None => format!("value"),
486489
};

src/librustc_mir/borrow_check/mutability_errors.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
4040
let item_msg;
4141
let reason;
4242
let mut opt_source = None;
43-
let access_place_desc = self.describe_place(access_place);
43+
let access_place_desc = self.describe_place(access_place.as_place_ref());
4444
debug!("report_mutability_error: access_place_desc={:?}", access_place_desc);
4545

4646
match the_place_err {
@@ -236,7 +236,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
236236
format!(
237237
"mutable borrow occurs due to use of `{}` in closure",
238238
// always Some() if the message is printed.
239-
self.describe_place(access_place).unwrap_or_default(),
239+
self.describe_place(access_place.as_place_ref()).unwrap_or_default(),
240240
)
241241
);
242242
borrow_span

src/librustc_mir/borrow_check/nll/explain_borrow/mod.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -304,7 +304,8 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
304304
region,
305305
);
306306
if let Some(region_name) = region_name {
307-
let opt_place_desc = self.describe_place(&borrow.borrowed_place);
307+
let opt_place_desc =
308+
self.describe_place(borrow.borrowed_place.as_place_ref());
308309
BorrowExplanation::MustBeValidFor {
309310
category,
310311
from_closure,

0 commit comments

Comments
 (0)