Skip to content

Commit 154cd94

Browse files
committed
rework region flags: 'static can be erased too
The existing flags did not consider `'static` to be "free". This then fed into what was "erasable" -- but `'static` is most certainly erasable.
1 parent 02e6525 commit 154cd94

File tree

3 files changed

+34
-8
lines changed

3 files changed

+34
-8
lines changed

src/librustc/ty/fold.rs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -97,14 +97,19 @@ pub trait TypeFoldable<'tcx>: fmt::Debug + Clone {
9797
fn has_closure_types(&self) -> bool {
9898
self.has_type_flags(TypeFlags::HAS_TY_CLOSURE)
9999
}
100+
/// "Free" regions in this context means that it has any region
101+
/// that is not (a) erased or (b) late-bound.
102+
fn has_free_regions(&self) -> bool {
103+
self.has_type_flags(TypeFlags::HAS_FREE_REGIONS)
104+
}
105+
106+
/// True if there any any un-erased free regions.
100107
fn has_erasable_regions(&self) -> bool {
101-
self.has_type_flags(TypeFlags::HAS_RE_EARLY_BOUND |
102-
TypeFlags::HAS_RE_INFER |
103-
TypeFlags::HAS_FREE_REGIONS)
108+
self.has_type_flags(TypeFlags::HAS_FREE_REGIONS)
104109
}
110+
105111
fn is_normalized_for_trans(&self) -> bool {
106-
!self.has_type_flags(TypeFlags::HAS_RE_EARLY_BOUND |
107-
TypeFlags::HAS_RE_INFER |
112+
!self.has_type_flags(TypeFlags::HAS_RE_INFER |
108113
TypeFlags::HAS_FREE_REGIONS |
109114
TypeFlags::HAS_TY_INFER |
110115
TypeFlags::HAS_PARAMS |

src/librustc/ty/mod.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -421,8 +421,18 @@ bitflags! {
421421
const HAS_TY_INFER = 1 << 2;
422422
const HAS_RE_INFER = 1 << 3;
423423
const HAS_RE_SKOL = 1 << 4;
424+
425+
/// Does this have any `ReEarlyBound` regions? Used to
426+
/// determine whether substitition is required, since those
427+
/// represent regions that are bound in a `ty::Generics` and
428+
/// hence may be substituted.
424429
const HAS_RE_EARLY_BOUND = 1 << 5;
430+
431+
/// Does this have any region that "appears free" in the type?
432+
/// Basically anything but `ReLateBound` and `ReErased`.
425433
const HAS_FREE_REGIONS = 1 << 6;
434+
435+
/// Is an error type reachable?
426436
const HAS_TY_ERR = 1 << 7;
427437
const HAS_PROJECTION = 1 << 8;
428438

src/librustc/ty/sty.rs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1184,18 +1184,29 @@ impl RegionKind {
11841184

11851185
match *self {
11861186
ty::ReVar(..) => {
1187+
flags = flags | TypeFlags::HAS_FREE_REGIONS;
11871188
flags = flags | TypeFlags::HAS_RE_INFER;
11881189
flags = flags | TypeFlags::KEEP_IN_LOCAL_TCX;
11891190
}
11901191
ty::ReSkolemized(..) => {
1192+
flags = flags | TypeFlags::HAS_FREE_REGIONS;
11911193
flags = flags | TypeFlags::HAS_RE_INFER;
11921194
flags = flags | TypeFlags::HAS_RE_SKOL;
11931195
flags = flags | TypeFlags::KEEP_IN_LOCAL_TCX;
11941196
}
11951197
ty::ReLateBound(..) => { }
1196-
ty::ReEarlyBound(..) => { flags = flags | TypeFlags::HAS_RE_EARLY_BOUND; }
1197-
ty::ReStatic | ty::ReErased => { }
1198-
_ => { flags = flags | TypeFlags::HAS_FREE_REGIONS; }
1198+
ty::ReEarlyBound(..) => {
1199+
flags = flags | TypeFlags::HAS_FREE_REGIONS;
1200+
flags = flags | TypeFlags::HAS_RE_EARLY_BOUND;
1201+
}
1202+
ty::ReEmpty |
1203+
ty::ReStatic |
1204+
ty::ReFree { .. } |
1205+
ty::ReScope { .. } => {
1206+
flags = flags | TypeFlags::HAS_FREE_REGIONS;
1207+
}
1208+
ty::ReErased => {
1209+
}
11991210
}
12001211

12011212
match *self {

0 commit comments

Comments
 (0)