Module rustc::middle::mem_categorizationUnstable [-] [+] [src]

Categorization

The job of the categorization module is to analyze an expression to determine what kind of memory is used in evaluating it (for example, where dereferences occur and what kind of pointer is dereferenced; whether the memory is mutable; etc)

Categorization effectively transforms all of our expressions into expressions of the following forms (the actual enum has many more possibilities, naturally, but they are all variants of these base forms):

E = rvalue    // some computed rvalue
  | x         // address of a local variable or argument
  | *E        // deref of a ptr
  | E.comp    // access to an interior component

Imagine a routine ToAddr(Expr) that evaluates an expression and returns an address where the result is to be found. If Expr is an lvalue, then this is the address of the lvalue. If Expr is an rvalue, this is the address of some temporary spot in memory where the result is stored.

Now, cat_expr() classifies the expression Expr and the address A=ToAddr(Expr) as follows:

The resulting categorization tree differs somewhat from the expressions themselves. For example, auto-derefs are explicit. Also, an index a[b] is decomposed into two operations: a dereference to reach the array data and then an index to jump forward to the relevant item.

By-reference upvars

One part of the translation which may be non-obvious is that we translate closure upvars into the dereference of a borrowed pointer; this more closely resembles the runtime translation. So, for example, if we had:

let mut x = 3;
let y = 5;
let inc = || x += y;

Then when we categorize x (within the closure) we would yield a result of *x', effectively, where x' is a cat_upvar reference tied to x. The type of x' will be a borrowed pointer.

Reexports

pub use self::PointerKind::*;
pub use self::InteriorKind::*;
pub use self::FieldName::*;
pub use self::ElementKind::*;
pub use self::MutabilityCategory::*;
pub use self::InteriorSafety::*;
pub use self::AliasableReason::*;
pub use self::Note::*;
pub use self::deref_kind::*;
pub use self::categorization::*;

Structs

MemCategorizationContext
Upvar
cmt_

Enums

AliasableReason
ElementKind
FieldName
InteriorKind
InteriorOffsetKind
InteriorSafety
MutabilityCategory
Note
PointerKind
categorization
deref_kind

Traits

Typer

The Typer trait provides the interface for the mem-categorization module to the results of the type check. It can be used to query the type assigned to an expression node, to inquire after adjustments, and so on.

ast_node

Functions

ptr_sigil

Type Definitions

McResult
cmt