Clean up TypeFlags
* Reorder flags to group similar ones together * Make some flags more granular * Compute `HAS_FREE_LOCAL_NAMES` from the other flags * Remove `HAS_TY_CLOSURE` * Add some more doc comments
This commit is contained in:
parent
ebc86b441d
commit
1617ec4ad2
4 changed files with 96 additions and 84 deletions
|
@ -80,13 +80,10 @@ impl FlagComputation {
|
||||||
&ty::Error => self.add_flags(TypeFlags::HAS_TY_ERR),
|
&ty::Error => self.add_flags(TypeFlags::HAS_TY_ERR),
|
||||||
|
|
||||||
&ty::Param(_) => {
|
&ty::Param(_) => {
|
||||||
self.add_flags(TypeFlags::HAS_FREE_LOCAL_NAMES);
|
self.add_flags(TypeFlags::HAS_TY_PARAM);
|
||||||
self.add_flags(TypeFlags::HAS_PARAMS);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
&ty::Generator(_, ref substs, _) => {
|
&ty::Generator(_, ref substs, _) => {
|
||||||
self.add_flags(TypeFlags::HAS_TY_CLOSURE);
|
|
||||||
self.add_flags(TypeFlags::HAS_FREE_LOCAL_NAMES);
|
|
||||||
self.add_substs(substs);
|
self.add_substs(substs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -97,8 +94,6 @@ impl FlagComputation {
|
||||||
}
|
}
|
||||||
|
|
||||||
&ty::Closure(_, ref substs) => {
|
&ty::Closure(_, ref substs) => {
|
||||||
self.add_flags(TypeFlags::HAS_TY_CLOSURE);
|
|
||||||
self.add_flags(TypeFlags::HAS_FREE_LOCAL_NAMES);
|
|
||||||
self.add_substs(substs);
|
self.add_substs(substs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -107,12 +102,10 @@ impl FlagComputation {
|
||||||
}
|
}
|
||||||
|
|
||||||
&ty::Placeholder(..) => {
|
&ty::Placeholder(..) => {
|
||||||
self.add_flags(TypeFlags::HAS_FREE_LOCAL_NAMES);
|
|
||||||
self.add_flags(TypeFlags::HAS_TY_PLACEHOLDER);
|
self.add_flags(TypeFlags::HAS_TY_PLACEHOLDER);
|
||||||
}
|
}
|
||||||
|
|
||||||
&ty::Infer(infer) => {
|
&ty::Infer(infer) => {
|
||||||
self.add_flags(TypeFlags::HAS_FREE_LOCAL_NAMES); // it might, right?
|
|
||||||
self.add_flags(TypeFlags::HAS_TY_INFER);
|
self.add_flags(TypeFlags::HAS_TY_INFER);
|
||||||
match infer {
|
match infer {
|
||||||
ty::FreshTy(_) | ty::FreshIntTy(_) | ty::FreshFloatTy(_) => {}
|
ty::FreshTy(_) | ty::FreshIntTy(_) | ty::FreshFloatTy(_) => {}
|
||||||
|
@ -128,17 +121,17 @@ impl FlagComputation {
|
||||||
}
|
}
|
||||||
|
|
||||||
&ty::Projection(ref data) => {
|
&ty::Projection(ref data) => {
|
||||||
self.add_flags(TypeFlags::HAS_PROJECTION);
|
self.add_flags(TypeFlags::HAS_TY_PROJECTION);
|
||||||
self.add_projection_ty(data);
|
self.add_projection_ty(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
&ty::UnnormalizedProjection(ref data) => {
|
&ty::UnnormalizedProjection(ref data) => {
|
||||||
self.add_flags(TypeFlags::HAS_PROJECTION);
|
self.add_flags(TypeFlags::HAS_TY_PROJECTION);
|
||||||
self.add_projection_ty(data);
|
self.add_projection_ty(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
&ty::Opaque(_, substs) => {
|
&ty::Opaque(_, substs) => {
|
||||||
self.add_flags(TypeFlags::HAS_PROJECTION | TypeFlags::HAS_TY_OPAQUE);
|
self.add_flags(TypeFlags::HAS_TY_OPAQUE);
|
||||||
self.add_substs(substs);
|
self.add_substs(substs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -221,10 +214,10 @@ impl FlagComputation {
|
||||||
match c.val {
|
match c.val {
|
||||||
ty::ConstKind::Unevaluated(_, substs, _) => {
|
ty::ConstKind::Unevaluated(_, substs, _) => {
|
||||||
self.add_substs(substs);
|
self.add_substs(substs);
|
||||||
self.add_flags(TypeFlags::HAS_PROJECTION);
|
self.add_flags(TypeFlags::HAS_CT_PROJECTION);
|
||||||
}
|
}
|
||||||
ty::ConstKind::Infer(infer) => {
|
ty::ConstKind::Infer(infer) => {
|
||||||
self.add_flags(TypeFlags::HAS_FREE_LOCAL_NAMES | TypeFlags::HAS_CT_INFER);
|
self.add_flags(TypeFlags::HAS_CT_INFER);
|
||||||
match infer {
|
match infer {
|
||||||
InferConst::Fresh(_) => {}
|
InferConst::Fresh(_) => {}
|
||||||
InferConst::Var(_) => self.add_flags(TypeFlags::KEEP_IN_LOCAL_TCX),
|
InferConst::Var(_) => self.add_flags(TypeFlags::KEEP_IN_LOCAL_TCX),
|
||||||
|
@ -232,11 +225,9 @@ impl FlagComputation {
|
||||||
}
|
}
|
||||||
ty::ConstKind::Bound(debruijn, _) => self.add_binder(debruijn),
|
ty::ConstKind::Bound(debruijn, _) => self.add_binder(debruijn),
|
||||||
ty::ConstKind::Param(_) => {
|
ty::ConstKind::Param(_) => {
|
||||||
self.add_flags(TypeFlags::HAS_FREE_LOCAL_NAMES);
|
self.add_flags(TypeFlags::HAS_CT_PARAM);
|
||||||
self.add_flags(TypeFlags::HAS_PARAMS);
|
|
||||||
}
|
}
|
||||||
ty::ConstKind::Placeholder(_) => {
|
ty::ConstKind::Placeholder(_) => {
|
||||||
self.add_flags(TypeFlags::HAS_FREE_LOCAL_NAMES);
|
|
||||||
self.add_flags(TypeFlags::HAS_CT_PLACEHOLDER);
|
self.add_flags(TypeFlags::HAS_CT_PLACEHOLDER);
|
||||||
}
|
}
|
||||||
ty::ConstKind::Value(_) => {}
|
ty::ConstKind::Value(_) => {}
|
||||||
|
|
|
@ -85,7 +85,7 @@ pub trait TypeFoldable<'tcx>: fmt::Debug + Clone {
|
||||||
self.has_type_flags(TypeFlags::HAS_TY_ERR)
|
self.has_type_flags(TypeFlags::HAS_TY_ERR)
|
||||||
}
|
}
|
||||||
fn has_param_types(&self) -> bool {
|
fn has_param_types(&self) -> bool {
|
||||||
self.has_type_flags(TypeFlags::HAS_PARAMS)
|
self.has_type_flags(TypeFlags::HAS_TY_PARAM | TypeFlags::HAS_CT_PARAM)
|
||||||
}
|
}
|
||||||
fn has_infer_types(&self) -> bool {
|
fn has_infer_types(&self) -> bool {
|
||||||
self.has_type_flags(TypeFlags::HAS_TY_INFER)
|
self.has_type_flags(TypeFlags::HAS_TY_INFER)
|
||||||
|
@ -100,9 +100,7 @@ pub trait TypeFoldable<'tcx>: fmt::Debug + Clone {
|
||||||
self.has_type_flags(TypeFlags::KEEP_IN_LOCAL_TCX)
|
self.has_type_flags(TypeFlags::KEEP_IN_LOCAL_TCX)
|
||||||
}
|
}
|
||||||
fn needs_infer(&self) -> bool {
|
fn needs_infer(&self) -> bool {
|
||||||
self.has_type_flags(
|
self.has_type_flags(TypeFlags::NEEDS_INFER)
|
||||||
TypeFlags::HAS_TY_INFER | TypeFlags::HAS_RE_INFER | TypeFlags::HAS_CT_INFER,
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
fn has_placeholders(&self) -> bool {
|
fn has_placeholders(&self) -> bool {
|
||||||
self.has_type_flags(
|
self.has_type_flags(
|
||||||
|
|
|
@ -515,79 +515,107 @@ pub struct CReaderCacheKey {
|
||||||
pub pos: usize,
|
pub pos: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
// Flags that we track on types. These flags are propagated upwards
|
|
||||||
// through the type during type construction, so that we can quickly
|
|
||||||
// check whether the type has various kinds of types in it without
|
|
||||||
// recursing over the type itself.
|
|
||||||
bitflags! {
|
bitflags! {
|
||||||
|
/// Flags that we track on types. These flags are propagated upwards
|
||||||
|
/// through the type during type construction, so that we can quickly check
|
||||||
|
/// whether the type has various kinds of types in it without recursing
|
||||||
|
/// over the type itself.
|
||||||
pub struct TypeFlags: u32 {
|
pub struct TypeFlags: u32 {
|
||||||
const HAS_PARAMS = 1 << 0;
|
// Does this have parameters? Used to determine whether substitution is
|
||||||
const HAS_TY_INFER = 1 << 1;
|
// required.
|
||||||
const HAS_RE_INFER = 1 << 2;
|
/// Does this have [Param]?
|
||||||
const HAS_RE_PLACEHOLDER = 1 << 3;
|
const HAS_TY_PARAM = 1 << 0;
|
||||||
|
/// Does this have [ReEarlyBound]?
|
||||||
|
const HAS_RE_PARAM = 1 << 1;
|
||||||
|
/// Does this have [ConstKind::Param]?
|
||||||
|
const HAS_CT_PARAM = 1 << 2;
|
||||||
|
|
||||||
/// Does this have any `ReEarlyBound` regions? Used to
|
const NEEDS_SUBST = TypeFlags::HAS_TY_PARAM.bits
|
||||||
/// determine whether substitition is required, since those
|
| TypeFlags::HAS_RE_PARAM.bits
|
||||||
/// represent regions that are bound in a `ty::Generics` and
|
| TypeFlags::HAS_CT_PARAM.bits;
|
||||||
/// hence may be substituted.
|
|
||||||
const HAS_RE_EARLY_BOUND = 1 << 4;
|
|
||||||
|
|
||||||
/// Does this have any region that "appears free" in the type?
|
/// Does this have [Infer]?
|
||||||
/// Basically anything but `ReLateBound` and `ReErased`.
|
const HAS_TY_INFER = 1 << 3;
|
||||||
const HAS_FREE_REGIONS = 1 << 5;
|
/// Does this have [ReVar]?
|
||||||
|
const HAS_RE_INFER = 1 << 4;
|
||||||
|
/// Does this have [ConstKind::Infer]?
|
||||||
|
const HAS_CT_INFER = 1 << 5;
|
||||||
|
|
||||||
/// Is an error type reachable?
|
/// Does this have inference variables? Used to determine whether
|
||||||
const HAS_TY_ERR = 1 << 6;
|
/// inference is required.
|
||||||
const HAS_PROJECTION = 1 << 7;
|
const NEEDS_INFER = TypeFlags::HAS_TY_INFER.bits
|
||||||
|
| TypeFlags::HAS_RE_INFER.bits
|
||||||
|
| TypeFlags::HAS_CT_INFER.bits;
|
||||||
|
|
||||||
// FIXME: Rename this to the actual property since it's used for generators too
|
/// Does this have [Placeholder]?
|
||||||
const HAS_TY_CLOSURE = 1 << 8;
|
const HAS_TY_PLACEHOLDER = 1 << 6;
|
||||||
|
/// Does this have [RePlaceholder]?
|
||||||
|
const HAS_RE_PLACEHOLDER = 1 << 7;
|
||||||
|
/// Does this have [ConstKind::Placeholder]?
|
||||||
|
const HAS_CT_PLACEHOLDER = 1 << 8;
|
||||||
|
|
||||||
/// `true` if there are "names" of types and regions and so forth
|
/// `true` if there are "names" of types and regions and so forth
|
||||||
/// that are local to a particular fn
|
/// that are local to a particular fn
|
||||||
const HAS_FREE_LOCAL_NAMES = 1 << 9;
|
const HAS_FREE_LOCAL_NAMES = TypeFlags::HAS_TY_PARAM.bits
|
||||||
|
| TypeFlags::HAS_RE_PARAM.bits
|
||||||
|
| TypeFlags::HAS_CT_PARAM.bits
|
||||||
|
| TypeFlags::HAS_TY_INFER.bits
|
||||||
|
| TypeFlags::HAS_RE_INFER.bits
|
||||||
|
| TypeFlags::HAS_CT_INFER.bits
|
||||||
|
| TypeFlags::HAS_TY_PLACEHOLDER.bits
|
||||||
|
| TypeFlags::HAS_RE_PLACEHOLDER.bits
|
||||||
|
| TypeFlags::HAS_CT_PLACEHOLDER.bits;
|
||||||
|
|
||||||
|
/// Does this have [Projection] or [UnnormalizedProjection]?
|
||||||
|
const HAS_TY_PROJECTION = 1 << 9;
|
||||||
|
/// Does this have [Opaque]?
|
||||||
|
const HAS_TY_OPAQUE = 1 << 10;
|
||||||
|
/// Does this have [ConstKind::Unevaluated]?
|
||||||
|
const HAS_CT_PROJECTION = 1 << 11;
|
||||||
|
|
||||||
|
/// Could this type be normalized further?
|
||||||
|
const HAS_PROJECTION = TypeFlags::HAS_TY_PROJECTION.bits
|
||||||
|
| TypeFlags::HAS_TY_OPAQUE.bits
|
||||||
|
| TypeFlags::HAS_CT_PROJECTION.bits;
|
||||||
|
|
||||||
/// Present if the type belongs in a local type context.
|
/// Present if the type belongs in a local type context.
|
||||||
/// Only set for Infer other than Fresh.
|
/// Set for placeholders and inference variables that are not "Fresh".
|
||||||
const KEEP_IN_LOCAL_TCX = 1 << 10;
|
const KEEP_IN_LOCAL_TCX = 1 << 12;
|
||||||
|
|
||||||
/// Does this have any `ReLateBound` regions? Used to check
|
/// Is an error type reachable?
|
||||||
|
const HAS_TY_ERR = 1 << 13;
|
||||||
|
|
||||||
|
/// Does this have any region that "appears free" in the type?
|
||||||
|
/// Basically anything but [ReLateBound] and [ReErased].
|
||||||
|
const HAS_FREE_REGIONS = 1 << 14;
|
||||||
|
|
||||||
|
/// Does this have any [ReLateBound] regions? Used to check
|
||||||
/// if a global bound is safe to evaluate.
|
/// if a global bound is safe to evaluate.
|
||||||
const HAS_RE_LATE_BOUND = 1 << 11;
|
const HAS_RE_LATE_BOUND = 1 << 15;
|
||||||
|
|
||||||
/// Does this have any `ReErased` regions?
|
/// Does this have any [ReErased] regions?
|
||||||
const HAS_RE_ERASED = 1 << 12;
|
const HAS_RE_ERASED = 1 << 16;
|
||||||
|
|
||||||
const HAS_TY_PLACEHOLDER = 1 << 13;
|
|
||||||
|
|
||||||
const HAS_CT_INFER = 1 << 14;
|
|
||||||
const HAS_CT_PLACEHOLDER = 1 << 15;
|
|
||||||
/// Does this have any [Opaque] types.
|
|
||||||
const HAS_TY_OPAQUE = 1 << 16;
|
|
||||||
|
|
||||||
const NEEDS_SUBST = TypeFlags::HAS_PARAMS.bits |
|
|
||||||
TypeFlags::HAS_RE_EARLY_BOUND.bits;
|
|
||||||
|
|
||||||
/// Flags representing the nominal content of a type,
|
/// Flags representing the nominal content of a type,
|
||||||
/// computed by FlagsComputation. If you add a new nominal
|
/// computed by FlagsComputation. If you add a new nominal
|
||||||
/// flag, it should be added here too.
|
/// flag, it should be added here too.
|
||||||
const NOMINAL_FLAGS = TypeFlags::HAS_PARAMS.bits |
|
const NOMINAL_FLAGS = TypeFlags::HAS_TY_PARAM.bits
|
||||||
TypeFlags::HAS_TY_INFER.bits |
|
| TypeFlags::HAS_RE_PARAM.bits
|
||||||
TypeFlags::HAS_RE_INFER.bits |
|
| TypeFlags::HAS_CT_PARAM.bits
|
||||||
TypeFlags::HAS_RE_PLACEHOLDER.bits |
|
| TypeFlags::HAS_TY_INFER.bits
|
||||||
TypeFlags::HAS_RE_EARLY_BOUND.bits |
|
| TypeFlags::HAS_RE_INFER.bits
|
||||||
TypeFlags::HAS_FREE_REGIONS.bits |
|
| TypeFlags::HAS_CT_INFER.bits
|
||||||
TypeFlags::HAS_TY_ERR.bits |
|
| TypeFlags::HAS_TY_PLACEHOLDER.bits
|
||||||
TypeFlags::HAS_PROJECTION.bits |
|
| TypeFlags::HAS_RE_PLACEHOLDER.bits
|
||||||
TypeFlags::HAS_TY_CLOSURE.bits |
|
| TypeFlags::HAS_CT_PLACEHOLDER.bits
|
||||||
TypeFlags::HAS_FREE_LOCAL_NAMES.bits |
|
| TypeFlags::HAS_TY_PROJECTION.bits
|
||||||
TypeFlags::KEEP_IN_LOCAL_TCX.bits |
|
| TypeFlags::HAS_TY_OPAQUE.bits
|
||||||
TypeFlags::HAS_RE_LATE_BOUND.bits |
|
| TypeFlags::HAS_CT_PROJECTION.bits
|
||||||
TypeFlags::HAS_RE_ERASED.bits |
|
| TypeFlags::KEEP_IN_LOCAL_TCX.bits
|
||||||
TypeFlags::HAS_TY_PLACEHOLDER.bits |
|
| TypeFlags::HAS_TY_ERR.bits
|
||||||
TypeFlags::HAS_CT_INFER.bits |
|
| TypeFlags::HAS_FREE_REGIONS.bits
|
||||||
TypeFlags::HAS_CT_PLACEHOLDER.bits |
|
| TypeFlags::HAS_RE_LATE_BOUND.bits
|
||||||
TypeFlags::HAS_TY_OPAQUE.bits;
|
| TypeFlags::HAS_RE_ERASED.bits;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1816,10 +1844,10 @@ impl<'tcx> ParamEnv<'tcx> {
|
||||||
Reveal::UserFacing => ParamEnvAnd { param_env: self, value },
|
Reveal::UserFacing => ParamEnvAnd { param_env: self, value },
|
||||||
|
|
||||||
Reveal::All => {
|
Reveal::All => {
|
||||||
if value.has_placeholders() || value.needs_infer() || value.has_param_types() {
|
if value.is_global() {
|
||||||
ParamEnvAnd { param_env: self, value }
|
|
||||||
} else {
|
|
||||||
ParamEnvAnd { param_env: self.without_caller_bounds(), value }
|
ParamEnvAnd { param_env: self.without_caller_bounds(), value }
|
||||||
|
} else {
|
||||||
|
ParamEnvAnd { param_env: self, value }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1768,7 +1768,7 @@ impl RegionKind {
|
||||||
}
|
}
|
||||||
ty::ReEarlyBound(..) => {
|
ty::ReEarlyBound(..) => {
|
||||||
flags = flags | TypeFlags::HAS_FREE_REGIONS;
|
flags = flags | TypeFlags::HAS_FREE_REGIONS;
|
||||||
flags = flags | TypeFlags::HAS_RE_EARLY_BOUND;
|
flags = flags | TypeFlags::HAS_RE_PARAM;
|
||||||
}
|
}
|
||||||
ty::ReEmpty(_) | ty::ReStatic | ty::ReFree { .. } | ty::ReScope { .. } => {
|
ty::ReEmpty(_) | ty::ReStatic | ty::ReFree { .. } | ty::ReScope { .. } => {
|
||||||
flags = flags | TypeFlags::HAS_FREE_REGIONS;
|
flags = flags | TypeFlags::HAS_FREE_REGIONS;
|
||||||
|
@ -1781,11 +1781,6 @@ impl RegionKind {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
match *self {
|
|
||||||
ty::ReStatic | ty::ReEmpty(_) | ty::ReErased | ty::ReLateBound(..) => (),
|
|
||||||
_ => flags = flags | TypeFlags::HAS_FREE_LOCAL_NAMES,
|
|
||||||
}
|
|
||||||
|
|
||||||
debug!("type_flags({:?}) = {:?}", self, flags);
|
debug!("type_flags({:?}) = {:?}", self, flags);
|
||||||
|
|
||||||
flags
|
flags
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue