Skip to content

Commit d165f93

Browse files
fmeasecompiler-errors
authored andcommitted
Properly deduce the object lifetime default in GAT paths
1 parent 87443f3 commit d165f93

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
@@ -1481,17 +1481,21 @@ impl<'a, 'tcx> BoundVarContext<'a, 'tcx> {
14811481

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

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

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