use helper function for error reporting
This commit is contained in:
parent
b3a47d9b6b
commit
9cf0ff26f8
2 changed files with 29 additions and 17 deletions
|
@ -1467,6 +1467,32 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
|
||||||
|
|
||||||
/// Reports StorageDeadOrDrop of `place` conflicts with `borrow`.
|
/// Reports StorageDeadOrDrop of `place` conflicts with `borrow`.
|
||||||
///
|
///
|
||||||
|
/// Depending on the origin of the StorageDeadOrDrop, this may be
|
||||||
|
/// reported as either a drop or an illegal mutation of a borrowed value.
|
||||||
|
/// The latter is preferred when the this is a drop triggered by a
|
||||||
|
/// reassignment, as it's more user friendly to report a problem with the
|
||||||
|
/// explicit assignment than the implicit drop.
|
||||||
|
#[instrument(level = "debug", skip(self))]
|
||||||
|
pub(crate) fn report_storage_dead_or_drop_of_borrowed(
|
||||||
|
&mut self,
|
||||||
|
location: Location,
|
||||||
|
place_span: (Place<'tcx>, Span),
|
||||||
|
borrow: &BorrowData<'tcx>,
|
||||||
|
) {
|
||||||
|
// It's sufficient to check the last desugaring as Replace is the last
|
||||||
|
// one to be applied.
|
||||||
|
if let Some(DesugaringKind::Replace) = place_span.1.desugaring_kind() {
|
||||||
|
self.report_illegal_mutation_of_borrowed(location, place_span, borrow)
|
||||||
|
} else {
|
||||||
|
self.report_borrowed_value_does_not_live_long_enough(
|
||||||
|
location,
|
||||||
|
borrow,
|
||||||
|
place_span,
|
||||||
|
Some(WriteKind::StorageDeadOrDrop),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// This means that some data referenced by `borrow` needs to live
|
/// This means that some data referenced by `borrow` needs to live
|
||||||
/// past the point where the StorageDeadOrDrop of `place` occurs.
|
/// past the point where the StorageDeadOrDrop of `place` occurs.
|
||||||
/// This is usually interpreted as meaning that `place` has too
|
/// This is usually interpreted as meaning that `place` has too
|
||||||
|
|
|
@ -40,7 +40,7 @@ use rustc_middle::mir::{InlineAsmOperand, Terminator, TerminatorKind};
|
||||||
use rustc_middle::ty::query::Providers;
|
use rustc_middle::ty::query::Providers;
|
||||||
use rustc_middle::ty::{self, CapturedPlace, ParamEnv, RegionVid, TyCtxt};
|
use rustc_middle::ty::{self, CapturedPlace, ParamEnv, RegionVid, TyCtxt};
|
||||||
use rustc_session::lint::builtin::UNUSED_MUT;
|
use rustc_session::lint::builtin::UNUSED_MUT;
|
||||||
use rustc_span::{DesugaringKind, Span, Symbol};
|
use rustc_span::{Span, Symbol};
|
||||||
|
|
||||||
use either::Either;
|
use either::Either;
|
||||||
use smallvec::SmallVec;
|
use smallvec::SmallVec;
|
||||||
|
@ -1184,22 +1184,8 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
|
||||||
this.report_conflicting_borrow(location, place_span, bk, borrow);
|
this.report_conflicting_borrow(location, place_span, bk, borrow);
|
||||||
this.buffer_error(err);
|
this.buffer_error(err);
|
||||||
}
|
}
|
||||||
WriteKind::StorageDeadOrDrop => {
|
WriteKind::StorageDeadOrDrop => this
|
||||||
if let Some(DesugaringKind::Replace) = place_span.1.desugaring_kind() {
|
.report_storage_dead_or_drop_of_borrowed(location, place_span, borrow),
|
||||||
// If this is a drop triggered by a reassignment, it's more user friendly
|
|
||||||
// to report a problem with the explicit assignment than the implicit drop.
|
|
||||||
this.report_illegal_mutation_of_borrowed(
|
|
||||||
location, place_span, borrow,
|
|
||||||
)
|
|
||||||
} else {
|
|
||||||
this.report_borrowed_value_does_not_live_long_enough(
|
|
||||||
location,
|
|
||||||
borrow,
|
|
||||||
place_span,
|
|
||||||
Some(kind),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
WriteKind::Mutate => {
|
WriteKind::Mutate => {
|
||||||
this.report_illegal_mutation_of_borrowed(location, place_span, borrow)
|
this.report_illegal_mutation_of_borrowed(location, place_span, borrow)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue