1
Fork 0

Rollup merge of #69956 - matthewjasper:fix-region-flags, r=nikomatsakis

Ensure HAS_FREE_LOCAL_NAMES is set for ReFree

This fixes a bug introduced by #69469.
I don't have any ideas on how to reate a regression test for this.
This commit is contained in:
Mazdak Farrokhzad 2020-03-17 12:16:18 +01:00 committed by GitHub
commit 98295f7908
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 33 additions and 30 deletions

View file

@ -554,24 +554,26 @@ bitflags! {
/// Does this have [ConstKind::Placeholder]? /// Does this have [ConstKind::Placeholder]?
const HAS_CT_PLACEHOLDER = 1 << 8; const HAS_CT_PLACEHOLDER = 1 << 8;
/// `true` if there are "names" of regions and so forth
/// that are local to a particular fn/inferctxt
const HAS_FREE_LOCAL_REGIONS = 1 << 9;
/// `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 = TypeFlags::HAS_TY_PARAM.bits const HAS_FREE_LOCAL_NAMES = TypeFlags::HAS_TY_PARAM.bits
| TypeFlags::HAS_RE_PARAM.bits
| TypeFlags::HAS_CT_PARAM.bits | TypeFlags::HAS_CT_PARAM.bits
| TypeFlags::HAS_TY_INFER.bits | TypeFlags::HAS_TY_INFER.bits
| TypeFlags::HAS_RE_INFER.bits
| TypeFlags::HAS_CT_INFER.bits | TypeFlags::HAS_CT_INFER.bits
| TypeFlags::HAS_TY_PLACEHOLDER.bits | TypeFlags::HAS_TY_PLACEHOLDER.bits
| TypeFlags::HAS_RE_PLACEHOLDER.bits | TypeFlags::HAS_CT_PLACEHOLDER.bits
| TypeFlags::HAS_CT_PLACEHOLDER.bits; | TypeFlags::HAS_FREE_LOCAL_REGIONS.bits;
/// Does this have [Projection] or [UnnormalizedProjection]? /// Does this have [Projection] or [UnnormalizedProjection]?
const HAS_TY_PROJECTION = 1 << 9; const HAS_TY_PROJECTION = 1 << 10;
/// Does this have [Opaque]? /// Does this have [Opaque]?
const HAS_TY_OPAQUE = 1 << 10; const HAS_TY_OPAQUE = 1 << 11;
/// Does this have [ConstKind::Unevaluated]? /// Does this have [ConstKind::Unevaluated]?
const HAS_CT_PROJECTION = 1 << 11; const HAS_CT_PROJECTION = 1 << 12;
/// Could this type be normalized further? /// Could this type be normalized further?
const HAS_PROJECTION = TypeFlags::HAS_TY_PROJECTION.bits const HAS_PROJECTION = TypeFlags::HAS_TY_PROJECTION.bits
@ -580,21 +582,21 @@ bitflags! {
/// Present if the type belongs in a local type context. /// Present if the type belongs in a local type context.
/// Set for placeholders and inference variables that are not "Fresh". /// Set for placeholders and inference variables that are not "Fresh".
const KEEP_IN_LOCAL_TCX = 1 << 12; const KEEP_IN_LOCAL_TCX = 1 << 13;
/// Is an error type reachable? /// Is an error type reachable?
const HAS_TY_ERR = 1 << 13; const HAS_TY_ERR = 1 << 14;
/// Does this have any region that "appears free" in the type? /// Does this have any region that "appears free" in the type?
/// Basically anything but [ReLateBound] and [ReErased]. /// Basically anything but [ReLateBound] and [ReErased].
const HAS_FREE_REGIONS = 1 << 14; const HAS_FREE_REGIONS = 1 << 15;
/// Does this have any [ReLateBound] regions? Used to check /// 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 << 15; const HAS_RE_LATE_BOUND = 1 << 16;
/// Does this have any [ReErased] regions? /// Does this have any [ReErased] regions?
const HAS_RE_ERASED = 1 << 16; const HAS_RE_ERASED = 1 << 17;
/// 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
@ -608,6 +610,7 @@ bitflags! {
| TypeFlags::HAS_TY_PLACEHOLDER.bits | TypeFlags::HAS_TY_PLACEHOLDER.bits
| TypeFlags::HAS_RE_PLACEHOLDER.bits | TypeFlags::HAS_RE_PLACEHOLDER.bits
| TypeFlags::HAS_CT_PLACEHOLDER.bits | TypeFlags::HAS_CT_PLACEHOLDER.bits
| TypeFlags::HAS_FREE_LOCAL_REGIONS.bits
| TypeFlags::HAS_TY_PROJECTION.bits | TypeFlags::HAS_TY_PROJECTION.bits
| TypeFlags::HAS_TY_OPAQUE.bits | TypeFlags::HAS_TY_OPAQUE.bits
| TypeFlags::HAS_CT_PROJECTION.bits | TypeFlags::HAS_CT_PROJECTION.bits

View file

@ -1743,42 +1743,42 @@ impl RegionKind {
} }
} }
pub fn keep_in_local_tcx(&self) -> bool {
if let ty::ReVar(..) = self { true } else { false }
}
pub fn type_flags(&self) -> TypeFlags { pub fn type_flags(&self) -> TypeFlags {
let mut flags = TypeFlags::empty(); let mut flags = TypeFlags::empty();
if self.keep_in_local_tcx() {
flags = flags | TypeFlags::KEEP_IN_LOCAL_TCX;
}
match *self { match *self {
ty::ReVar(..) => { ty::ReVar(..) => {
flags = flags | TypeFlags::HAS_FREE_REGIONS; flags = flags | TypeFlags::HAS_FREE_REGIONS;
flags = flags | TypeFlags::HAS_FREE_LOCAL_REGIONS;
flags = flags | TypeFlags::HAS_RE_INFER; flags = flags | TypeFlags::HAS_RE_INFER;
flags = flags | TypeFlags::KEEP_IN_LOCAL_TCX;
} }
ty::RePlaceholder(..) => { ty::RePlaceholder(..) => {
flags = flags | TypeFlags::HAS_FREE_REGIONS; flags = flags | TypeFlags::HAS_FREE_REGIONS;
flags = flags | TypeFlags::HAS_FREE_LOCAL_REGIONS;
flags = flags | TypeFlags::HAS_RE_PLACEHOLDER; flags = flags | TypeFlags::HAS_RE_PLACEHOLDER;
} }
ty::ReEarlyBound(..) => {
flags = flags | TypeFlags::HAS_FREE_REGIONS;
flags = flags | TypeFlags::HAS_FREE_LOCAL_REGIONS;
flags = flags | TypeFlags::HAS_RE_PARAM;
}
ty::ReFree { .. } | ty::ReScope { .. } => {
flags = flags | TypeFlags::HAS_FREE_REGIONS;
flags = flags | TypeFlags::HAS_FREE_LOCAL_REGIONS;
}
ty::ReEmpty(_) | ty::ReStatic => {
flags = flags | TypeFlags::HAS_FREE_REGIONS;
}
ty::ReClosureBound(..) => {
flags = flags | TypeFlags::HAS_FREE_REGIONS;
}
ty::ReLateBound(..) => { ty::ReLateBound(..) => {
flags = flags | TypeFlags::HAS_RE_LATE_BOUND; flags = flags | TypeFlags::HAS_RE_LATE_BOUND;
} }
ty::ReEarlyBound(..) => {
flags = flags | TypeFlags::HAS_FREE_REGIONS;
flags = flags | TypeFlags::HAS_RE_PARAM;
}
ty::ReEmpty(_) | ty::ReStatic | ty::ReFree { .. } | ty::ReScope { .. } => {
flags = flags | TypeFlags::HAS_FREE_REGIONS;
}
ty::ReErased => { ty::ReErased => {
flags = flags | TypeFlags::HAS_RE_ERASED; flags = flags | TypeFlags::HAS_RE_ERASED;
} }
ty::ReClosureBound(..) => {
flags = flags | TypeFlags::HAS_FREE_REGIONS;
}
} }
debug!("type_flags({:?}) = {:?}", self, flags); debug!("type_flags({:?}) = {:?}", self, flags);