struct Validator<'a, 'tcx> {
ccx: &'a ConstCx<'a, 'tcx>,
temps: &'a mut IndexSlice<Local, TempState>,
promotion_safe_blocks: Option<FxHashSet<BasicBlock>>,
}
Expand description
Checks whether locals that appear in a promotion context (Candidate
) are actually promotable.
This wraps an Item
, and has access to all fields of that Item
via Deref
coercion.
Fields§
§ccx: &'a ConstCx<'a, 'tcx>
§temps: &'a mut IndexSlice<Local, TempState>
§promotion_safe_blocks: Option<FxHashSet<BasicBlock>>
For backwards compatibility, we are promoting function calls in const
/static
initializers. But we want to avoid evaluating code that might panic and that otherwise would
not have been evaluated, so we only promote such calls in basic blocks that are guaranteed
to execute. In other words, we only promote such calls in basic blocks that are definitely
not dead code. Here we cache the result of computing that set of basic blocks.
Implementations§
Source§impl<'tcx> Validator<'_, 'tcx>
impl<'tcx> Validator<'_, 'tcx>
fn validate_candidate( &mut self, candidate: Candidate, ) -> Result<(), Unpromotable>
fn qualif_local<Q: Qualif>(&mut self, local: Local) -> bool
fn validate_local(&mut self, local: Local) -> Result<(), Unpromotable>
fn validate_place(&mut self, place: PlaceRef<'tcx>) -> Result<(), Unpromotable>
fn validate_operand( &mut self, operand: &Operand<'tcx>, ) -> Result<(), Unpromotable>
fn validate_ref( &mut self, kind: BorrowKind, place: &Place<'tcx>, ) -> Result<(), Unpromotable>
fn validate_rvalue(&mut self, rvalue: &Rvalue<'tcx>) -> Result<(), Unpromotable>
Sourcefn promotion_safe_blocks(body: &Body<'tcx>) -> FxHashSet<BasicBlock>
fn promotion_safe_blocks(body: &Body<'tcx>) -> FxHashSet<BasicBlock>
Computes the sets of blocks of this MIR that are definitely going to be executed if the function returns successfully. That makes it safe to promote calls in them that might fail.
Sourcefn is_promotion_safe_block(&mut self, block: BasicBlock) -> bool
fn is_promotion_safe_block(&mut self, block: BasicBlock) -> bool
Returns whether the block is “safe” for promotion, which means it cannot be dead code. We use this to avoid promoting operations that can fail in dead code.
fn validate_call( &mut self, callee: &Operand<'tcx>, args: &[Spanned<Operand<'tcx>>], block: BasicBlock, ) -> Result<(), Unpromotable>
Methods from Deref<Target = ConstCx<'a, 'tcx>>§
pub fn def_id(&self) -> LocalDefId
pub fn const_kind(&self) -> ConstContext
pub fn const_kind(&self) -> ConstContext
Returns the kind of const context this Item
represents (const
, static
, etc.).
Panics if this Item
is not const.
pub fn enforce_recursive_const_stability(&self) -> bool
pub fn fn_sig(&self) -> Binder<TyCtxt<'tcx>, FnSig<TyCtxt<'tcx>>>
Trait Implementations§
Auto Trait Implementations§
impl<'a, 'tcx> DynSend for Validator<'a, 'tcx>
impl<'a, 'tcx> DynSync for Validator<'a, 'tcx>
impl<'a, 'tcx> Freeze for Validator<'a, 'tcx>
impl<'a, 'tcx> !RefUnwindSafe for Validator<'a, 'tcx>
impl<'a, 'tcx> !Send for Validator<'a, 'tcx>
impl<'a, 'tcx> !Sync for Validator<'a, 'tcx>
impl<'a, 'tcx> Unpin for Validator<'a, 'tcx>
impl<'a, 'tcx> !UnwindSafe for Validator<'a, 'tcx>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T, R> CollectAndApply<T, R> for T
impl<T, R> CollectAndApply<T, R> for T
Source§impl<T> Filterable for T
impl<T> Filterable for T
Source§fn filterable(
self,
filter_name: &'static str,
) -> RequestFilterDataProvider<T, fn(_: DataRequest<'_>) -> bool>
fn filterable( self, filter_name: &'static str, ) -> RequestFilterDataProvider<T, fn(_: DataRequest<'_>) -> bool>
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§impl<P> IntoQueryParam<P> for P
impl<P> IntoQueryParam<P> for P
fn into_query_param(self) -> P
Source§impl<T> MaybeResult<T> for T
impl<T> MaybeResult<T> for T
Source§impl<T> Pointable for T
impl<T> Pointable for T
§impl<I, T> UpcastFrom<I, T> for T
impl<I, T> UpcastFrom<I, T> for T
fn upcast_from(from: T, _tcx: I) -> T
§impl<Tcx, T> Value<Tcx> for Twhere
Tcx: DepContext,
impl<Tcx, T> Value<Tcx> for Twhere
Tcx: DepContext,
default fn from_cycle_error( tcx: Tcx, cycle_error: &CycleError, _guar: ErrorGuaranteed, ) -> T
Source§impl<T> WithSubscriber for T
impl<T> WithSubscriber for T
Source§fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
Source§fn with_current_subscriber(self) -> WithDispatch<Self>
fn with_current_subscriber(self) -> WithDispatch<Self>
impl<'a, T> Captures<'a> for Twhere
T: ?Sized,
impl<'a, T> Captures<'a> for Twhere
T: ?Sized,
impl<T> ErasedDestructor for Twhere
T: 'static,
Layout§
Note: Most layout information is completely unstable and may even differ between compilations. The only exception is types with certain repr(...)
attributes. Please see the Rust Reference's “Type Layout” chapter for details on type layout guarantees.
Size: 56 bytes