[−][src]Enum rustc_middle::mir::FakeReadCause
The FakeReadCause describes the type of pattern why a FakeRead statement exists.
Variants
Inject a fake read of the borrowed input at the end of each guards code.
This should ensure that you cannot change the variant for an enum while you are in the midst of matching on it.
let x: !; match x {} doesn't generate any read of x so we need to
generate a read of x to check that it is initialized and safe.
A fake read of the RefWithinGuard version of a bind-by-value variable in a match guard to ensure that it's value hasn't change by the time we create the OutsideGuard version.
Officially, the semantics of
let pattern = <expr>;
is that <expr> is evaluated into a temporary and then this temporary is
into the pattern.
However, if we see the simple pattern let var = <expr>, we optimize this to
evaluate <expr> directly into the variable var. This is mostly unobservable,
but in some cases it can affect the borrow checker, as in #53695.
Therefore, we insert a "fake read" here to ensure that we get
appropriate errors.
If we have an index expression like
(*x)[1][{ x = y; 4}]
then the first bounds check is invalidated when we evaluate the second
index expression. Thus we create a fake borrow of x across the second
indexer, which will cause a borrow check error.
Trait Implementations
impl Clone for FakeReadCause[src]
fn clone(&self) -> FakeReadCause[src]
fn clone_from(&mut self, source: &Self)1.0.0[src]
impl Copy for FakeReadCause[src]
impl Debug for FakeReadCause[src]
impl<'tcx, __D: TyDecoder<'tcx>> Decodable<__D> for FakeReadCause[src]
impl<'tcx, __E: TyEncoder<'tcx>> Encodable<__E> for FakeReadCause[src]
impl<'__ctx> HashStable<StableHashingContext<'__ctx>> for FakeReadCause[src]
fn hash_stable(
&self,
__hcx: &mut StableHashingContext<'__ctx>,
__hasher: &mut StableHasher
)[src]
&self,
__hcx: &mut StableHashingContext<'__ctx>,
__hasher: &mut StableHasher
)
impl<'tcx> Lift<'tcx> for FakeReadCause[src]
type Lifted = Self
fn lift_to_tcx(&self, _: TyCtxt<'tcx>) -> Option<Self>[src]
impl PartialEq<FakeReadCause> for FakeReadCause[src]
fn eq(&self, other: &FakeReadCause) -> bool[src]
#[must_use]fn ne(&self, other: &Rhs) -> bool1.0.0[src]
impl StructuralPartialEq for FakeReadCause[src]
impl<'tcx> TypeFoldable<'tcx> for FakeReadCause[src]
fn super_fold_with<F: TypeFolder<'tcx>>(&self, _: &mut F) -> FakeReadCause[src]
fn super_visit_with<F: TypeVisitor<'tcx>>(&self, _: &mut F) -> bool[src]
fn fold_with<F: TypeFolder<'tcx>>(&self, folder: &mut F) -> Self[src]
fn visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> bool[src]
fn has_vars_bound_at_or_above(&self, binder: DebruijnIndex) -> bool[src]
fn has_vars_bound_above(&self, binder: DebruijnIndex) -> bool[src]
fn has_escaping_bound_vars(&self) -> bool[src]
fn has_type_flags(&self, flags: TypeFlags) -> bool[src]
fn has_projections(&self) -> bool[src]
fn has_opaque_types(&self) -> bool[src]
fn references_error(&self) -> bool[src]
fn has_param_types_or_consts(&self) -> bool[src]
fn has_infer_regions(&self) -> bool[src]
fn has_infer_types(&self) -> bool[src]
fn has_infer_types_or_consts(&self) -> bool[src]
fn has_infer_consts(&self) -> bool[src]
fn needs_infer(&self) -> bool[src]
fn has_placeholders(&self) -> bool[src]
fn needs_subst(&self) -> bool[src]
fn has_re_placeholders(&self) -> bool[src]
fn has_free_regions(&self) -> bool[src]
fn has_erased_regions(&self) -> bool[src]
fn has_erasable_regions(&self) -> bool[src]
fn is_global(&self) -> bool[src]
fn has_late_bound_regions(&self) -> bool[src]
fn still_further_specializable(&self) -> bool[src]
fn visit_tys_shallow(&self, visit: impl FnMut(Ty<'tcx>) -> bool) -> bool[src]
Auto Trait Implementations
impl RefUnwindSafe for FakeReadCause
impl Send for FakeReadCause
impl Sync for FakeReadCause
impl Unpin for FakeReadCause
impl UnwindSafe for FakeReadCause
Blanket Implementations
impl<T> Any for T where
T: 'static + ?Sized, [src]
T: 'static + ?Sized,
impl<'tcx, T> ArenaAllocatable<'tcx, ()> for T where
T: Copy, [src]
T: Copy,
fn allocate_on(Self, &'a Arena<'tcx>) -> &'a mut T[src]
fn allocate_from_iter(
&'a Arena<'tcx>,
impl IntoIterator<Item = T>
) -> &'a mut [T][src]
&'a Arena<'tcx>,
impl IntoIterator<Item = T>
) -> &'a mut [T]
impl<T> Borrow<T> for T where
T: ?Sized, [src]
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized, [src]
T: ?Sized,
fn borrow_mut(&mut self) -> &mut T[src]
impl<'a, T> Captures<'a> for T where
T: ?Sized, [src]
T: ?Sized,
impl<Ctxt, T> DepNodeParams<Ctxt> for T where
Ctxt: DepContext,
T: HashStable<<Ctxt as DepContext>::StableHashingContext> + Debug, [src]
Ctxt: DepContext,
T: HashStable<<Ctxt as DepContext>::StableHashingContext> + Debug,
default fn can_reconstruct_query_key() -> bool[src]
default fn to_fingerprint(&self, tcx: Ctxt) -> Fingerprint[src]
default fn to_debug_str(&self, Ctxt) -> String[src]
default fn recover(Ctxt, &DepNode<<Ctxt as DepContext>::DepKind>) -> Option<T>[src]
impl<T> From<T> for T[src]
impl<T, U> Into<U> for T where
U: From<T>, [src]
U: From<T>,
impl<T> MaybeResult<T> for T[src]
type Error = !
fn from(Result<T, <T as MaybeResult<T>>::Error>) -> T[src]
fn to_result(self) -> Result<T, <T as MaybeResult<T>>::Error>[src]
impl<'tcx, T> Subst<'tcx> for T where
T: TypeFoldable<'tcx>, [src]
T: TypeFoldable<'tcx>,
fn subst_spanned(&Self, TyCtxt<'tcx>, &[GenericArg<'tcx>], Option<Span>) -> T[src]
fn subst(&self, tcx: TyCtxt<'tcx>, substs: &[GenericArg<'tcx>]) -> Self[src]
impl<T> ToOwned for T where
T: Clone, [src]
T: Clone,
type Owned = T
The resulting type after obtaining ownership.
fn to_owned(&self) -> T[src]
fn clone_into(&self, target: &mut T)[src]
impl<T, U> TryFrom<U> for T where
U: Into<T>, [src]
U: Into<T>,
type Error = Infallible
The type returned in the event of a conversion error.
fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>[src]
impl<T, U> TryInto<U> for T where
U: TryFrom<T>, [src]
U: TryFrom<T>,
type Error = <U as TryFrom<T>>::Error
The type returned in the event of a conversion error.