Auto merge of #98247 - jackh726:regionkind-rustc-type-ir, r=compiler-errors
Move RegionKind to rustc_type_ir (Also UniverseIndex) r? rust-lang/types
This commit is contained in:
@@ -55,6 +55,7 @@ use std::{fmt, str};
|
||||
|
||||
pub use crate::ty::diagnostics::*;
|
||||
pub use rustc_type_ir::InferTy::*;
|
||||
pub use rustc_type_ir::RegionKind::*;
|
||||
pub use rustc_type_ir::TyKind::*;
|
||||
pub use rustc_type_ir::*;
|
||||
|
||||
@@ -80,7 +81,6 @@ pub use self::list::List;
|
||||
pub use self::parameterized::ParameterizedOverTcx;
|
||||
pub use self::rvalue_scopes::RvalueScopes;
|
||||
pub use self::sty::BoundRegionKind::*;
|
||||
pub use self::sty::RegionKind::*;
|
||||
pub use self::sty::{
|
||||
Article, Binder, BoundRegion, BoundRegionKind, BoundTy, BoundTyKind, BoundVar,
|
||||
BoundVariableKind, CanonicalPolyFnSig, ClosureSubsts, ClosureSubstsParts, ConstVid,
|
||||
@@ -1161,83 +1161,6 @@ impl<'tcx> OpaqueHiddenType<'tcx> {
|
||||
}
|
||||
}
|
||||
|
||||
rustc_index::newtype_index! {
|
||||
/// "Universes" are used during type- and trait-checking in the
|
||||
/// presence of `for<..>` binders to control what sets of names are
|
||||
/// visible. Universes are arranged into a tree: the root universe
|
||||
/// contains names that are always visible. Each child then adds a new
|
||||
/// set of names that are visible, in addition to those of its parent.
|
||||
/// We say that the child universe "extends" the parent universe with
|
||||
/// new names.
|
||||
///
|
||||
/// To make this more concrete, consider this program:
|
||||
///
|
||||
/// ```ignore (illustrative)
|
||||
/// struct Foo { }
|
||||
/// fn bar<T>(x: T) {
|
||||
/// let y: for<'a> fn(&'a u8, Foo) = ...;
|
||||
/// }
|
||||
/// ```
|
||||
///
|
||||
/// The struct name `Foo` is in the root universe U0. But the type
|
||||
/// parameter `T`, introduced on `bar`, is in an extended universe U1
|
||||
/// -- i.e., within `bar`, we can name both `T` and `Foo`, but outside
|
||||
/// of `bar`, we cannot name `T`. Then, within the type of `y`, the
|
||||
/// region `'a` is in a universe U2 that extends U1, because we can
|
||||
/// name it inside the fn type but not outside.
|
||||
///
|
||||
/// Universes are used to do type- and trait-checking around these
|
||||
/// "forall" binders (also called **universal quantification**). The
|
||||
/// idea is that when, in the body of `bar`, we refer to `T` as a
|
||||
/// type, we aren't referring to any type in particular, but rather a
|
||||
/// kind of "fresh" type that is distinct from all other types we have
|
||||
/// actually declared. This is called a **placeholder** type, and we
|
||||
/// use universes to talk about this. In other words, a type name in
|
||||
/// universe 0 always corresponds to some "ground" type that the user
|
||||
/// declared, but a type name in a non-zero universe is a placeholder
|
||||
/// type -- an idealized representative of "types in general" that we
|
||||
/// use for checking generic functions.
|
||||
pub struct UniverseIndex {
|
||||
derive [HashStable]
|
||||
DEBUG_FORMAT = "U{}",
|
||||
}
|
||||
}
|
||||
|
||||
impl UniverseIndex {
|
||||
pub const ROOT: UniverseIndex = UniverseIndex::from_u32(0);
|
||||
|
||||
/// Returns the "next" universe index in order -- this new index
|
||||
/// is considered to extend all previous universes. This
|
||||
/// corresponds to entering a `forall` quantifier. So, for
|
||||
/// example, suppose we have this type in universe `U`:
|
||||
///
|
||||
/// ```ignore (illustrative)
|
||||
/// for<'a> fn(&'a u32)
|
||||
/// ```
|
||||
///
|
||||
/// Once we "enter" into this `for<'a>` quantifier, we are in a
|
||||
/// new universe that extends `U` -- in this new universe, we can
|
||||
/// name the region `'a`, but that region was not nameable from
|
||||
/// `U` because it was not in scope there.
|
||||
pub fn next_universe(self) -> UniverseIndex {
|
||||
UniverseIndex::from_u32(self.private.checked_add(1).unwrap())
|
||||
}
|
||||
|
||||
/// Returns `true` if `self` can name a name from `other` -- in other words,
|
||||
/// if the set of names in `self` is a superset of those in
|
||||
/// `other` (`self >= other`).
|
||||
pub fn can_name(self, other: UniverseIndex) -> bool {
|
||||
self.private >= other.private
|
||||
}
|
||||
|
||||
/// Returns `true` if `self` cannot name some names from `other` -- in other
|
||||
/// words, if the set of names in `self` is a strict subset of
|
||||
/// those in `other` (`self < other`).
|
||||
pub fn cannot_name(self, other: UniverseIndex) -> bool {
|
||||
self.private < other.private
|
||||
}
|
||||
}
|
||||
|
||||
/// The "placeholder index" fully defines a placeholder region, type, or const. Placeholders are
|
||||
/// identified by both a universe, as well as a name residing within that universe. Distinct bound
|
||||
/// regions/types/consts within the same universe simply have an unknown relationship to one
|
||||
|
||||
Reference in New Issue
Block a user