Enum rustc_mir::borrow_check::nll::type_check::Locations [−][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 Locations
type summarizes where region constraints are
required to hold. Normally, this is at a particular point which
created the obligation, but for constraints that the user gave, we
want the constraint to hold at all points.
Variants
All
🔬 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 a type constraint should always be true. This is particularly important in the new borrowck analysis for things like the type of the return slot. Consider this example:
fn foo<'a>(x: &'a u32) -> &'a u32 { let y = 22; return &y; // error }
Here, we wind up with the signature from the return type being
something like &'1 u32
where '1
is a universal region. But
the type of the return slot _0
is something like &'2 u32
where '2
is an existential region variable. The type checker
requires that &'2 u32 = &'1 u32
-- but at what point? In the
older NLL analysis, we required this only at the entry point
to the function. By the nature of the constraints, this wound
up propagating to all points reachable from start (because
'1
-- as a universal region -- is live everywhere). In the
newer analysis, though, this doesn't work: _0
is considered
dead at the start (it has no usable value) and hence this type
equality is basically a no-op. Then, later on, when we do _0 = &'3 y
, that region '3
never winds up related to the
universal region '1
and hence no error occurs. Therefore, we
use Locations::All instead, which ensures that the '1
and
'2
are equal everything. We also use this for other
user-given type annotations; e.g., if the user wrote let mut x: &'static u32 = ...
, we would ensure that all values
assigned to x
are of 'static
lifetime.
Boring(Location)
🔬 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?
A "boring" constraint (caused by the given location) is one that the user probably doesn't want to see described in diagnostics, because it is kind of an artifact of the type system setup.
Example: x = Foo { field: y }
technically creates
intermediate regions representing the "type of Foo { field: y }
", and data flows from y
into those variables, but they
are not very interesting. The assignment into x
on the other
hand might be.
Interesting(Location)
🔬 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?
An important outlives constraint (caused by the given
location) is one that would be useful to highlight in
diagnostics, because it represents a point where references
flow from one spot to another (e.g., x = y
)
Methods
impl Locations
[src]
impl Locations
pub fn from_location(&self) -> Option<Location>
[src]
pub fn from_location(&self) -> Option<Location>
🔬 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?
pub fn span(&self, mir: &Mir) -> Span
[src]
pub fn span(&self, mir: &Mir) -> Span
🔬 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?
Gets a span representing the location.
Trait Implementations
impl Copy for Locations
[src]
impl Copy for Locations
impl Clone for Locations
[src]
impl Clone for Locations
fn clone(&self) -> Locations
[src]
fn clone(&self) -> Locations
Returns a copy of the value. Read more
fn clone_from(&mut self, source: &Self)
1.0.0[src]
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from source
. Read more
impl PartialEq for Locations
[src]
impl PartialEq for Locations
fn eq(&self, other: &Locations) -> bool
[src]
fn eq(&self, other: &Locations) -> bool
This method tests for self
and other
values to be equal, and is used by ==
. Read more
fn ne(&self, other: &Locations) -> bool
[src]
fn ne(&self, other: &Locations) -> bool
This method tests for !=
.
impl Eq for Locations
[src]
impl Eq for Locations
fn assert_receiver_is_total_eq(&self)
[src]
fn assert_receiver_is_total_eq(&self)
impl PartialOrd for Locations
[src]
impl PartialOrd for Locations
fn partial_cmp(&self, other: &Locations) -> Option<Ordering>
[src]
fn partial_cmp(&self, other: &Locations) -> Option<Ordering>
This method returns an ordering between self
and other
values if one exists. Read more
fn lt(&self, other: &Locations) -> bool
[src]
fn lt(&self, other: &Locations) -> bool
This method tests less than (for self
and other
) and is used by the <
operator. Read more
fn le(&self, other: &Locations) -> bool
[src]
fn le(&self, other: &Locations) -> bool
This method tests less than or equal to (for self
and other
) and is used by the <=
operator. Read more
fn gt(&self, other: &Locations) -> bool
[src]
fn gt(&self, other: &Locations) -> bool
This method tests greater than (for self
and other
) and is used by the >
operator. Read more
fn ge(&self, other: &Locations) -> bool
[src]
fn ge(&self, other: &Locations) -> bool
This method tests greater than or equal to (for self
and other
) and is used by the >=
operator. Read more
impl Ord for Locations
[src]
impl Ord for Locations
fn cmp(&self, other: &Locations) -> Ordering
[src]
fn cmp(&self, other: &Locations) -> Ordering
This method returns an Ordering
between self
and other
. Read more
fn max(self, other: Self) -> Self
1.21.0[src]
fn max(self, other: Self) -> Self
Compares and returns the maximum of two values. Read more
fn min(self, other: Self) -> Self
1.21.0[src]
fn min(self, other: Self) -> Self
Compares and returns the minimum of two values. Read more
impl Hash for Locations
[src]
impl Hash for Locations
fn hash<__H: Hasher>(&self, state: &mut __H)
[src]
fn hash<__H: Hasher>(&self, state: &mut __H)
Feeds this value into the given [Hasher
]. Read more
fn hash_slice<H>(data: &[Self], state: &mut H) where
H: Hasher,
1.3.0[src]
fn hash_slice<H>(data: &[Self], state: &mut H) where
H: Hasher,
Feeds a slice of this type into the given [Hasher
]. Read more
impl Debug for Locations
[src]
impl Debug for Locations
fn fmt(&self, f: &mut Formatter) -> Result
[src]
fn fmt(&self, f: &mut Formatter) -> Result
Formats the value using the given formatter. Read more
impl NormalizeLocation for Locations
[src]
impl NormalizeLocation for Locations
fn to_locations(self) -> Locations
[src]
fn to_locations(self) -> Locations
🔬 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?