Struct rustc_typeck::expr_use_visitor::ExprUseVisitor [−][src]
pub struct ExprUseVisitor<'a, 'tcx> {
mc: MemCategorizationContext<'a, 'tcx>,
body_owner: LocalDefId,
delegate: &'a mut dyn Delegate<'tcx>,
}Expand description
The ExprUseVisitor type
This is the code that actually walks the tree.
Fields
mc: MemCategorizationContext<'a, 'tcx>body_owner: LocalDefIddelegate: &'a mut dyn Delegate<'tcx>Implementations
pub fn new(
delegate: &'a mut (dyn Delegate<'tcx> + 'a),
infcx: &'a InferCtxt<'a, 'tcx>,
body_owner: LocalDefId,
param_env: ParamEnv<'tcx>,
typeck_results: &'a TypeckResults<'tcx>
) -> Self
pub fn new(
delegate: &'a mut (dyn Delegate<'tcx> + 'a),
infcx: &'a InferCtxt<'a, 'tcx>,
body_owner: LocalDefId,
param_env: ParamEnv<'tcx>,
typeck_results: &'a TypeckResults<'tcx>
) -> Self
Creates the ExprUseVisitor, configuring it with the various options provided:
delegate– who receives the callbacksparam_env— parameter environment for trait lookups (esp. pertaining toCopy)typeck_results— typeck results for the code being analyzed
Indicates that the value of blk will be consumed, meaning either copied or moved
depending on its type.
Invoke the appropriate delegate calls for anything that gets consumed or borrowed as part of the automatic adjustment process.
fn walk_autoref(
&mut self,
expr: &Expr<'_>,
base_place: &PlaceWithHirId<'tcx>,
autoref: &AutoBorrow<'tcx>
)
fn walk_autoref(
&mut self,
expr: &Expr<'_>,
base_place: &PlaceWithHirId<'tcx>,
autoref: &AutoBorrow<'tcx>
)
Walks the autoref autoref applied to the autoderef’d
expr. base_place is the mem-categorized form of expr
after all relevant autoderefs have occurred.
Walks a pat that occurs in isolation (i.e., top-level of fn argument or let binding, and not a match arm or nested pat.)
The core driver for walking a pattern
Handle the case where the current body contains a closure.
When the current body being handled is a closure, then we must make sure that
- The parent closure only captures Places from the nested closure that are not local to it.
In the following example the closures c only captures p.x even though incr
is a capture of the nested closure
let p = ..;
let c = || {
let incr = 10;
let nested = || p.x += incr;
}- When reporting the Place back to the Delegate, ensure that the UpvarId uses the enclosing closure as the DefId.
Auto Trait Implementations
impl<'a, 'tcx> !RefUnwindSafe for ExprUseVisitor
impl<'a, 'tcx> !Send for ExprUseVisitor
impl<'a, 'tcx> !Sync for ExprUseVisitor
impl<'a, 'tcx> Unpin for ExprUseVisitor where
'tcx: 'a,
impl<'a, 'tcx> !UnwindSafe for ExprUseVisitor
Blanket Implementations
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: 64 bytes
