Skip to content

Commit 8bfcd86

Browse files
committed
Properly deduce the object lifetime default in GAT paths
1 parent c416a6f commit 8bfcd86

File tree

3 files changed

+37
-21
lines changed

3 files changed

+37
-21
lines changed

compiler/rustc_hir_analysis/src/collect/resolve_bound_vars.rs

+16-15
Original file line numberDiff line numberDiff line change
@@ -1482,17 +1482,21 @@ impl<'a, 'tcx> BoundVarContext<'a, 'tcx> {
14821482

14831483
// Figure out if this is a type/trait segment,
14841484
// which requires object lifetime defaults.
1485-
let type_def_id = match res {
1486-
Res::Def(DefKind::AssocTy, def_id) if depth == 1 => Some(self.tcx.parent(def_id)),
1487-
Res::Def(DefKind::Variant, def_id) if depth == 0 => Some(self.tcx.parent(def_id)),
1488-
Res::Def(
1489-
DefKind::Struct
1490-
| DefKind::Union
1491-
| DefKind::Enum
1492-
| DefKind::TyAlias
1493-
| DefKind::Trait,
1494-
def_id,
1495-
) if depth == 0 => Some(def_id),
1485+
let type_def_id = match (res, depth) {
1486+
(Res::Def(DefKind::AssocTy, def_id), 1) => Some(self.tcx.parent(def_id)),
1487+
(Res::Def(DefKind::Variant, def_id), 0) => Some(self.tcx.parent(def_id)),
1488+
(
1489+
Res::Def(
1490+
DefKind::Struct
1491+
| DefKind::Union
1492+
| DefKind::Enum
1493+
| DefKind::TyAlias
1494+
| DefKind::Trait
1495+
| DefKind::AssocTy,
1496+
def_id,
1497+
),
1498+
0,
1499+
) => Some(def_id),
14961500
_ => None,
14971501
};
14981502

@@ -1536,9 +1540,6 @@ impl<'a, 'tcx> BoundVarContext<'a, 'tcx> {
15361540
let map = &self.map;
15371541
let generics = self.tcx.generics_of(def_id);
15381542

1539-
// `type_def_id` points to an item, so there is nothing to inherit generics from.
1540-
debug_assert_eq!(generics.parent_count, 0);
1541-
15421543
let set_to_region = |set: ObjectLifetimeDefault| match set {
15431544
ObjectLifetimeDefault::Empty => {
15441545
if in_body {
@@ -1549,8 +1550,8 @@ impl<'a, 'tcx> BoundVarContext<'a, 'tcx> {
15491550
}
15501551
ObjectLifetimeDefault::Static => Some(ResolvedArg::StaticLifetime),
15511552
ObjectLifetimeDefault::Param(param_def_id) => {
1552-
// This index can be used with `generic_args` since `parent_count == 0`.
15531553
let index = generics.param_def_id_to_index[&param_def_id] as usize;
1554+
let index = index - generics.parent_count;
15541555
generic_args.args.get(index).and_then(|arg| match arg {
15551556
GenericArg::Lifetime(lt) => map.defs.get(&lt.hir_id).copied(),
15561557
_ => None,

src/librustdoc/clean/mod.rs

+5-6
Original file line numberDiff line numberDiff line change
@@ -1995,22 +1995,21 @@ impl<'tcx> ContainerTy<'_, 'tcx> {
19951995
| DefKind::Union
19961996
| DefKind::Enum
19971997
| DefKind::TyAlias
1998-
| DefKind::Trait) = tcx.def_kind(container)
1998+
| DefKind::Trait
1999+
| DefKind::AssocTy) = tcx.def_kind(container)
19992000
else {
20002001
return ObjectLifetimeDefault::Empty;
20012002
};
20022003

20032004
let generics = tcx.generics_of(container);
2004-
debug_assert_eq!(generics.parent_count, 0);
20052005

20062006
let param = generics.own_params[index].def_id;
20072007
let default = tcx.object_lifetime_default(param);
20082008
match default {
20092009
rbv::ObjectLifetimeDefault::Param(lifetime) => {
2010-
// The index is relative to the parent generics but since we don't have any,
2011-
// we don't need to translate it.
2012-
let index = generics.param_def_id_to_index[&lifetime];
2013-
let arg = args.skip_binder()[index as usize].expect_region();
2010+
let index = generics.param_def_id_to_index[&lifetime] as usize;
2011+
let index = index - generics.parent_count;
2012+
let arg = args.skip_binder()[index].expect_region();
20142013
ObjectLifetimeDefault::Arg(arg)
20152014
}
20162015
rbv::ObjectLifetimeDefault::Empty => ObjectLifetimeDefault::Empty,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// Properly deduce the object lifetime default in generic associated type (GAT) *paths*.
2+
// issue: rust-lang/rust#115379
3+
//@ check-pass
4+
5+
trait Outer {
6+
type Ty<'a, T: ?Sized + 'a>;
7+
}
8+
impl Outer for () {
9+
type Ty<'a, T: ?Sized + 'a> = &'a T;
10+
}
11+
trait Inner {}
12+
13+
fn f<'r>(x: <() as Outer>::Ty<'r, dyn Inner + 'r>) { g(x) }
14+
fn g<'r>(_: <() as Outer>::Ty<'r, dyn Inner>) {}
15+
16+
fn main() {}

0 commit comments

Comments
 (0)