File tree Expand file tree Collapse file tree 3 files changed +34
-8
lines changed Expand file tree Collapse file tree 3 files changed +34
-8
lines changed Original file line number Diff line number Diff line change @@ -97,14 +97,19 @@ pub trait TypeFoldable<'tcx>: fmt::Debug + Clone {
97
97
fn has_closure_types ( & self ) -> bool {
98
98
self . has_type_flags ( TypeFlags :: HAS_TY_CLOSURE )
99
99
}
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.
100
107
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 )
104
109
}
110
+
105
111
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 |
108
113
TypeFlags :: HAS_FREE_REGIONS |
109
114
TypeFlags :: HAS_TY_INFER |
110
115
TypeFlags :: HAS_PARAMS |
Original file line number Diff line number Diff line change @@ -421,8 +421,18 @@ bitflags! {
421
421
const HAS_TY_INFER = 1 << 2 ;
422
422
const HAS_RE_INFER = 1 << 3 ;
423
423
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.
424
429
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`.
425
433
const HAS_FREE_REGIONS = 1 << 6 ;
434
+
435
+ /// Is an error type reachable?
426
436
const HAS_TY_ERR = 1 << 7 ;
427
437
const HAS_PROJECTION = 1 << 8 ;
428
438
Original file line number Diff line number Diff line change @@ -1184,18 +1184,29 @@ impl RegionKind {
1184
1184
1185
1185
match * self {
1186
1186
ty:: ReVar ( ..) => {
1187
+ flags = flags | TypeFlags :: HAS_FREE_REGIONS ;
1187
1188
flags = flags | TypeFlags :: HAS_RE_INFER ;
1188
1189
flags = flags | TypeFlags :: KEEP_IN_LOCAL_TCX ;
1189
1190
}
1190
1191
ty:: ReSkolemized ( ..) => {
1192
+ flags = flags | TypeFlags :: HAS_FREE_REGIONS ;
1191
1193
flags = flags | TypeFlags :: HAS_RE_INFER ;
1192
1194
flags = flags | TypeFlags :: HAS_RE_SKOL ;
1193
1195
flags = flags | TypeFlags :: KEEP_IN_LOCAL_TCX ;
1194
1196
}
1195
1197
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
+ }
1199
1210
}
1200
1211
1201
1212
match * self {
You can’t perform that action at this time.
0 commit comments