Skip to content

Commit ca36288

Browse files
committed
Create a specific ObjectLifetimeDefault enum.
1 parent ca16d28 commit ca36288

File tree

5 files changed

+56
-83
lines changed

5 files changed

+56
-83
lines changed

compiler/rustc_middle/src/middle/resolve_lifetime.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,13 @@ impl<T: PartialEq> Set1<T> {
5050
}
5151
}
5252

53-
pub type ObjectLifetimeDefault = Set1<Region>;
53+
#[derive(Copy, Clone, Debug, HashStable, Encodable, Decodable)]
54+
pub enum ObjectLifetimeDefault {
55+
Empty,
56+
Static,
57+
Ambiguous,
58+
Param(DefId),
59+
}
5460

5561
/// Maps the id of each lifetime reference to the lifetime decl
5662
/// that it corresponds to.

compiler/rustc_middle/src/query/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1591,7 +1591,7 @@ rustc_queries! {
15911591
/// for each parameter if a trait object were to be passed for that parameter.
15921592
/// For example, for `struct Foo<'a, T, U>`, this would be `['static, 'static]`.
15931593
/// For `struct Foo<'a, T: 'a, U>`, this would instead be `['a, 'static]`.
1594-
query object_lifetime_defaults(_: DefId) -> Option<&'tcx [ObjectLifetimeDefault]> {
1594+
query object_lifetime_defaults(_: LocalDefId) -> Option<&'tcx [ObjectLifetimeDefault]> {
15951595
desc { "looking up lifetime defaults for a region on an item" }
15961596
}
15971597
/// Fetch the lifetimes for all the trait objects in an item-like.

compiler/rustc_typeck/src/astconv/mod.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -266,9 +266,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
266266
// (*) -- not late-bound, won't change
267267
}
268268
};
269-
270269
debug!("ast_region_to_region(lifetime={:?}) yields {:?}", lifetime, r);
271-
272270
r
273271
}
274272

compiler/rustc_typeck/src/collect.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ use rustc_hir::weak_lang_items;
3434
use rustc_hir::{GenericParamKind, HirId, Node};
3535
use rustc_middle::hir::nested_filter;
3636
use rustc_middle::middle::codegen_fn_attrs::{CodegenFnAttrFlags, CodegenFnAttrs};
37+
use rustc_middle::middle::resolve_lifetime::ObjectLifetimeDefault;
3738
use rustc_middle::mir::mono::Linkage;
3839
use rustc_middle::ty::query::Providers;
3940
use rustc_middle::ty::subst::InternalSubsts;
@@ -1636,7 +1637,7 @@ fn generics_of(tcx: TyCtxt<'_>, def_id: DefId) -> ty::Generics {
16361637
pure_wrt_drop: false,
16371638
kind: ty::GenericParamDefKind::Type {
16381639
has_default: false,
1639-
object_lifetime_default: rl::Set1::Empty,
1640+
object_lifetime_default: ObjectLifetimeDefault::Empty,
16401641
synthetic: false,
16411642
},
16421643
});
@@ -1714,7 +1715,7 @@ fn generics_of(tcx: TyCtxt<'_>, def_id: DefId) -> ty::Generics {
17141715
has_default: default.is_some(),
17151716
object_lifetime_default: object_lifetime_defaults
17161717
.as_ref()
1717-
.map_or(rl::Set1::Empty, |o| o[i]),
1718+
.map_or(ObjectLifetimeDefault::Empty, |o| o[i]),
17181719
synthetic,
17191720
};
17201721

@@ -1766,7 +1767,7 @@ fn generics_of(tcx: TyCtxt<'_>, def_id: DefId) -> ty::Generics {
17661767
pure_wrt_drop: false,
17671768
kind: ty::GenericParamDefKind::Type {
17681769
has_default: false,
1769-
object_lifetime_default: rl::Set1::Empty,
1770+
object_lifetime_default: ObjectLifetimeDefault::Empty,
17701771
synthetic: false,
17711772
},
17721773
}));
@@ -1783,7 +1784,7 @@ fn generics_of(tcx: TyCtxt<'_>, def_id: DefId) -> ty::Generics {
17831784
pure_wrt_drop: false,
17841785
kind: ty::GenericParamDefKind::Type {
17851786
has_default: false,
1786-
object_lifetime_default: rl::Set1::Empty,
1787+
object_lifetime_default: ObjectLifetimeDefault::Empty,
17871788
synthetic: false,
17881789
},
17891790
});

compiler/rustc_typeck/src/collect/object_lifetime_defaults.rs

Lines changed: 43 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -17,30 +17,9 @@ use tracing::debug;
1717

1818
pub(super) fn object_lifetime_defaults(
1919
tcx: TyCtxt<'_>,
20-
def_id: DefId,
20+
def_id: LocalDefId,
2121
) -> Option<&[ObjectLifetimeDefault]> {
22-
if let Some(def_id) = def_id.as_local() {
23-
match tcx.hir().get_by_def_id(def_id) {
24-
Node::Item(item) => compute_object_lifetime_defaults(tcx, item),
25-
_ => None,
26-
}
27-
} else {
28-
Some(tcx.arena.alloc_from_iter(tcx.generics_of(def_id).params.iter().filter_map(|param| {
29-
match param.kind {
30-
GenericParamDefKind::Type { object_lifetime_default, .. } => {
31-
Some(object_lifetime_default)
32-
}
33-
GenericParamDefKind::Const { .. } => Some(Set1::Empty),
34-
GenericParamDefKind::Lifetime => None,
35-
}
36-
})))
37-
}
38-
}
39-
40-
fn compute_object_lifetime_defaults<'tcx>(
41-
tcx: TyCtxt<'tcx>,
42-
item: &hir::Item<'_>,
43-
) -> Option<&'tcx [ObjectLifetimeDefault]> {
22+
let Node::Item(item) = tcx.hir().get_by_def_id(def_id) else { return None };
4423
match item.kind {
4524
hir::ItemKind::Struct(_, ref generics)
4625
| hir::ItemKind::Union(_, ref generics)
@@ -61,24 +40,18 @@ fn compute_object_lifetime_defaults<'tcx>(
6140
let object_lifetime_default_reprs: String = result
6241
.iter()
6342
.map(|set| match *set {
64-
Set1::Empty => "BaseDefault".into(),
65-
Set1::One(Region::Static) => "'static".into(),
66-
Set1::One(Region::EarlyBound(mut i, _)) => generics
67-
.params
68-
.iter()
69-
.find_map(|param| match param.kind {
70-
GenericParamKind::Lifetime { .. } => {
71-
if i == 0 {
72-
return Some(param.name.ident().to_string().into());
73-
}
74-
i -= 1;
75-
None
76-
}
77-
_ => None,
78-
})
79-
.unwrap(),
80-
Set1::One(_) => bug!(),
81-
Set1::Many => "Ambiguous".into(),
43+
ObjectLifetimeDefault::Empty => "BaseDefault".into(),
44+
ObjectLifetimeDefault::Static => "'static".into(),
45+
ObjectLifetimeDefault::Param(def_id) => {
46+
let def_id = def_id.expect_local();
47+
generics
48+
.params
49+
.iter()
50+
.find(|param| tcx.hir().local_def_id(param.hir_id) == def_id)
51+
.map(|param| param.name.ident().to_string().into())
52+
.unwrap()
53+
}
54+
ObjectLifetimeDefault::Ambiguous => "Ambiguous".into(),
8255
})
8356
.collect::<Vec<Cow<'static, str>>>()
8457
.join(",");
@@ -133,32 +106,20 @@ fn object_lifetime_defaults_for_item<'tcx>(
133106
}
134107

135108
Some(match set {
136-
Set1::Empty => Set1::Empty,
137-
Set1::One(hir::LifetimeName::Static) => Set1::One(Region::Static),
138-
Set1::One(hir::LifetimeName::Param(def_id, _)) => generics
139-
.params
140-
.iter()
141-
.filter_map(|param| match param.kind {
142-
GenericParamKind::Lifetime { .. } => {
143-
let param_def_id = tcx.hir().local_def_id(param.hir_id);
144-
Some(param_def_id)
145-
}
146-
_ => None,
147-
})
148-
.enumerate()
149-
.find(|&(_, param_def_id)| param_def_id == def_id)
150-
.map_or(Set1::Many, |(i, _)| {
151-
Set1::One(Region::EarlyBound(i as u32, def_id.to_def_id()))
152-
}),
153-
Set1::One(_) | Set1::Many => Set1::Many,
109+
Set1::Empty => ObjectLifetimeDefault::Empty,
110+
Set1::One(hir::LifetimeName::Static) => ObjectLifetimeDefault::Static,
111+
Set1::One(hir::LifetimeName::Param(def_id, _)) => {
112+
ObjectLifetimeDefault::Param(def_id.to_def_id())
113+
}
114+
Set1::One(_) | Set1::Many => ObjectLifetimeDefault::Ambiguous,
154115
})
155116
}
156117
GenericParamKind::Const { .. } => {
157118
// Generic consts don't impose any constraints.
158119
//
159120
// We still store a dummy value here to allow generic parameters
160121
// in an arbitrary order.
161-
Some(Set1::Empty)
122+
Some(ObjectLifetimeDefault::Empty)
162123
}
163124
};
164125

@@ -528,9 +489,7 @@ impl<'a, 'tcx> LifetimeContext<'a, 'tcx> {
528489
loop {
529490
match *scope {
530491
Scope::Root => break false,
531-
532492
Scope::Body => break true,
533-
534493
Scope::Binder { s, .. }
535494
| Scope::Static { s, .. }
536495
| Scope::ObjectLifetimeDefault { s, .. } => {
@@ -539,28 +498,37 @@ impl<'a, 'tcx> LifetimeContext<'a, 'tcx> {
539498
}
540499
}
541500
};
542-
543-
let set_to_region = |set: &ObjectLifetimeDefault| match *set {
544-
Set1::Empty => {
501+
let generics = self.tcx.generics_of(def_id);
502+
let set_to_region = |set: ObjectLifetimeDefault| match set {
503+
ObjectLifetimeDefault::Empty => {
545504
if in_body {
546505
None
547506
} else {
548507
Some(Region::Static)
549508
}
550509
}
551-
Set1::One(Region::EarlyBound(index, _)) => {
552-
let mut lifetimes = generic_args.args.iter().filter_map(|arg| match arg {
553-
GenericArg::Lifetime(lt) => Some(lt),
510+
ObjectLifetimeDefault::Static => Some(Region::Static),
511+
ObjectLifetimeDefault::Param(def_id) => {
512+
let index = generics.param_def_id_to_index[&def_id];
513+
generic_args.args.get(index as usize).and_then(|arg| match arg {
514+
GenericArg::Lifetime(lt) => self.tcx.named_region(lt.hir_id),
554515
_ => None,
555-
});
556-
lifetimes
557-
.nth(index as usize)
558-
.and_then(|lifetime| self.tcx.named_region(lifetime.hir_id))
516+
})
559517
}
560-
Set1::One(r) => Some(r),
561-
Set1::Many => None,
518+
ObjectLifetimeDefault::Ambiguous => None,
562519
};
563-
self.tcx.object_lifetime_defaults(def_id).unwrap().iter().map(set_to_region).collect()
520+
generics
521+
.params
522+
.iter()
523+
.filter_map(|param| match param.kind {
524+
GenericParamDefKind::Type { object_lifetime_default, .. } => {
525+
Some(object_lifetime_default)
526+
}
527+
GenericParamDefKind::Const { .. } => Some(ObjectLifetimeDefault::Empty),
528+
GenericParamDefKind::Lifetime => None,
529+
})
530+
.map(set_to_region)
531+
.collect()
564532
});
565533
debug!(?object_lifetime_defaults);
566534

0 commit comments

Comments
 (0)