Module rustc_typeck::check::upvar[−][src]

Expand description

Inferring borrow kinds for upvars

Whenever there is a closure expression, we need to determine how each upvar is used. We do this by initially assigning each upvar an immutable “borrow kind” (see ty::BorrowKind for details) and then “escalating” the kind as needed. The borrow kind proceeds according to the following lattice:

ty::ImmBorrow -> ty::UniqueImmBorrow -> ty::MutBorrow

So, for example, if we see an assignment x = 5 to an upvar x, we will promote its borrow kind to mutable borrow. If we see an &mut x we’ll do the same. Naturally, this applies not just to the upvar, but to everything owned by x, so the result is the same for something like x.f = 5 and so on (presuming x is not a borrowed pointer to a struct). These adjustments are performed in adjust_upvar_borrow_kind() (you can trace backwards through the code from there).

The fact that we are inferring borrow kinds as we go results in a semi-hacky interaction with mem-categorization. In particular, mem-categorization will query the current borrow kind as it categorizes, and we’ll return the current value, but this may get adjusted later. Therefore, in this module, we generally ignore the borrow kind (and derived mutabilities) that are returned from mem-categorization, since they may be inaccurate. (Another option would be to use a unification scheme, where instead of returning a concrete borrow kind like ty::ImmBorrow, we return a ty::InferBorrow(upvar_id) or something like that, but this would then mean that all later passes would have to check for these figments and report an error, and it just seems like more mess in the end.)

Structs

Enums

Describe the relationship between the paths of two places eg:

Functions

Helper function to determine if we need to escalate CaptureKind from CaptureInfo A to B and returns the escalated CaptureInfo. (Note: CaptureInfo contains CaptureKind and an expression that led to capture it in that way)

Determines the Ancestry relationship of Place A relative to Place B

Precise capture is enabled if the feature gate capture_disjoint_fields is enabled or if user is using Rust Edition 2021 or higher.

Return a two string tuple (s1, s2)

Truncate projections so that following rules are obeyed by the captured place:

Deref of a box isn’t captured in move clousres. This is motivated by:

Truncate the capture so that the place being borrowed is in accordance with RFC 1240, which states that it’s unsafe to take a reference into a struct marked repr(packed).

Truncates a place so that the resultant capture doesn’t move data out of a reference

Type Definitions

Intermediate format to store a captured Place and associated ty::CaptureInfo during capture analysis. Information in this map feeds into the minimum capture analysis pass.