diff options
| author | Giacomo Pasini <giacomo@status.im> | 2023-02-16 23:14:04 +0100 |
|---|---|---|
| committer | Giacomo Pasini <giacomo@status.im> | 2023-03-03 16:33:11 +0100 |
| commit | 9cf0ff26f82937a20d60a115cfb331e3f7a8c2d3 (patch) | |
| tree | 1d8377a3eb94a6ee91231f674cf5017a8b860deb | |
| parent | b3a47d9b6b26adebe9ce0e24c7efb26c6380d50a (diff) | |
| download | rust-9cf0ff26f82937a20d60a115cfb331e3f7a8c2d3.tar.gz rust-9cf0ff26f82937a20d60a115cfb331e3f7a8c2d3.zip | |
use helper function for error reporting
| -rw-r--r-- | compiler/rustc_borrowck/src/diagnostics/conflict_errors.rs | 26 | ||||
| -rw-r--r-- | compiler/rustc_borrowck/src/lib.rs | 20 |
2 files changed, 29 insertions, 17 deletions
diff --git a/compiler/rustc_borrowck/src/diagnostics/conflict_errors.rs b/compiler/rustc_borrowck/src/diagnostics/conflict_errors.rs index cb97699d7d2..a622a215a2e 100644 --- a/compiler/rustc_borrowck/src/diagnostics/conflict_errors.rs +++ b/compiler/rustc_borrowck/src/diagnostics/conflict_errors.rs @@ -1467,6 +1467,32 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { /// 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 /// past the point where the StorageDeadOrDrop of `place` occurs. /// This is usually interpreted as meaning that `place` has too diff --git a/compiler/rustc_borrowck/src/lib.rs b/compiler/rustc_borrowck/src/lib.rs index 11a746ffb0a..115e512a974 100644 --- a/compiler/rustc_borrowck/src/lib.rs +++ b/compiler/rustc_borrowck/src/lib.rs @@ -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::{DesugaringKind, Span, Symbol}; +use rustc_span::{Span, Symbol}; use either::Either; use smallvec::SmallVec; @@ -1184,22 +1184,8 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { this.report_conflicting_borrow(location, place_span, bk, borrow); this.buffer_error(err); } - 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::StorageDeadOrDrop => this + .report_storage_dead_or_drop_of_borrowed(location, place_span, borrow), WriteKind::Mutate => { this.report_illegal_mutation_of_borrowed(location, place_span, borrow) } |
