Struct rustc_typeck::check::coercion::CoerceMany[][src]

pub struct CoerceMany<'gcx, 'tcx, 'exprs, E> where
    'gcx: 'tcx,
    E: 'exprs + AsCoercionSite
{ expected_ty: Ty<'tcx>, final_ty: Option<Ty<'tcx>>, expressions: Expressions<'gcx, 'exprs, E>, pushed: usize, }
🔬 This is a nightly-only experimental API. (rustc_private)

this crate is being loaded from the sysroot, an unstable location; did you mean to load this crate from crates.io via Cargo.toml instead?

CoerceMany encapsulates the pattern you should use when you have many expressions that are all getting coerced to a common type. This arises, for example, when you have a match (the result of each arm is coerced to a common type). It also arises in less obvious places, such as when you have many break foo expressions that target the same loop, or the various return expressions in a function.

The basic protocol is as follows:

Example:

let mut coerce = CoerceMany::new(expected_ty);
for expr in exprs {
    let expr_ty = fcx.check_expr_with_expectation(expr, expected);
    coerce.coerce(fcx, &cause, expr, expr_ty);
}
let final_ty = coerce.complete(fcx);

Fields

🔬 This is a nightly-only experimental API. (rustc_private)

this crate is being loaded from the sysroot, an unstable location; did you mean to load this crate from crates.io via Cargo.toml instead?

🔬 This is a nightly-only experimental API. (rustc_private)

this crate is being loaded from the sysroot, an unstable location; did you mean to load this crate from crates.io via Cargo.toml instead?

🔬 This is a nightly-only experimental API. (rustc_private)

this crate is being loaded from the sysroot, an unstable location; did you mean to load this crate from crates.io via Cargo.toml instead?

🔬 This is a nightly-only experimental API. (rustc_private)

this crate is being loaded from the sysroot, an unstable location; did you mean to load this crate from crates.io via Cargo.toml instead?

Methods

impl<'gcx, 'tcx, 'exprs, E> CoerceMany<'gcx, 'tcx, 'exprs, E> where
    'gcx: 'tcx,
    E: 'exprs + AsCoercionSite
[src]

🔬 This is a nightly-only experimental API. (rustc_private)

this crate is being loaded from the sysroot, an unstable location; did you mean to load this crate from crates.io via Cargo.toml instead?

The usual case; collect the set of expressions dynamically. If the full set of coercion sites is known before hand, consider with_coercion_sites() instead to avoid allocation.

🔬 This is a nightly-only experimental API. (rustc_private)

this crate is being loaded from the sysroot, an unstable location; did you mean to load this crate from crates.io via Cargo.toml instead?

As an optimization, you can create a CoerceMany with a pre-existing slice of expressions. In this case, you are expected to pass each element in the slice to coerce(...) in order. This is used with arrays in particular to avoid needlessly cloning the slice.

🔬 This is a nightly-only experimental API. (rustc_private)

this crate is being loaded from the sysroot, an unstable location; did you mean to load this crate from crates.io via Cargo.toml instead?

🔬 This is a nightly-only experimental API. (rustc_private)

this crate is being loaded from the sysroot, an unstable location; did you mean to load this crate from crates.io via Cargo.toml instead?

Return the "expected type" with which this coercion was constructed. This represents the "downward propagated" type that was given to us at the start of typing whatever construct we are typing (e.g., the match expression).

Typically, this is used as the expected type when type-checking each of the alternative expressions whose types we are trying to merge.

🔬 This is a nightly-only experimental API. (rustc_private)

this crate is being loaded from the sysroot, an unstable location; did you mean to load this crate from crates.io via Cargo.toml instead?

Returns the current "merged type", representing our best-guess at the LUB of the expressions we've seen so far (if any). This isn't final until you call self.final(), which will return the merged type.

🔬 This is a nightly-only experimental API. (rustc_private)

this crate is being loaded from the sysroot, an unstable location; did you mean to load this crate from crates.io via Cargo.toml instead?

Indicates that the value generated by expression, which is of type expression_ty, is one of the possibility that we could coerce from. This will record expression and later calls to coerce may come back and add adjustments and things if necessary.

🔬 This is a nightly-only experimental API. (rustc_private)

this crate is being loaded from the sysroot, an unstable location; did you mean to load this crate from crates.io via Cargo.toml instead?

Indicates that one of the inputs is a "forced unit". This occurs in a case like if foo { ... };, where the missing else generates a "forced unit". Another example is a loop { break; }, where the break has no argument expression. We treat these cases slightly differently for error-reporting purposes. Note that these tend to correspond to cases where the () expression is implicit in the source, and hence we do not take an expression argument.

The augment_error gives you a chance to extend the error message, in case any results (e.g., we use this to suggest removing a ;).

🔬 This is a nightly-only experimental API. (rustc_private)

this crate is being loaded from the sysroot, an unstable location; did you mean to load this crate from crates.io via Cargo.toml instead?

The inner coercion "engine". If expression is None, this is a forced-unit case, and hence expression_ty must be Nil.

🔬 This is a nightly-only experimental API. (rustc_private)

this crate is being loaded from the sysroot, an unstable location; did you mean to load this crate from crates.io via Cargo.toml instead?

Auto Trait Implementations

impl<'gcx, 'tcx, 'exprs, E> !Send for CoerceMany<'gcx, 'tcx, 'exprs, E>

impl<'gcx, 'tcx, 'exprs, E> !Sync for CoerceMany<'gcx, 'tcx, 'exprs, E>