Desugars drop and replace at MIR build
This commit desugars the drop and replace deriving from an assignment at MIR build, avoiding the construction of the DropAndReplace terminator (which will be removed in a followign PR) In order to retain the same error messages for replaces a new DesugaringKind::Replace variant is introduced.
This commit is contained in:
@@ -40,7 +40,7 @@ use rustc_middle::mir::{InlineAsmOperand, Terminator, TerminatorKind};
|
||||
use rustc_middle::ty::query::Providers;
|
||||
use rustc_middle::ty::{self, CapturedPlace, ParamEnv, RegionVid, TyCtxt};
|
||||
use rustc_session::lint::builtin::UNUSED_MUT;
|
||||
use rustc_span::{Span, Symbol};
|
||||
use rustc_span::{DesugaringKind, Span, Symbol};
|
||||
|
||||
use either::Either;
|
||||
use smallvec::SmallVec;
|
||||
@@ -1184,13 +1184,22 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
|
||||
this.report_conflicting_borrow(location, place_span, bk, borrow);
|
||||
this.buffer_error(err);
|
||||
}
|
||||
WriteKind::StorageDeadOrDrop => this
|
||||
.report_borrowed_value_does_not_live_long_enough(
|
||||
location,
|
||||
borrow,
|
||||
place_span,
|
||||
Some(kind),
|
||||
),
|
||||
WriteKind::StorageDeadOrDrop => {
|
||||
if let Some(DesugaringKind::Replace) = place_span.1.desugaring_kind() {
|
||||
// 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 => {
|
||||
this.report_illegal_mutation_of_borrowed(location, place_span, borrow)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user