From ffb42065774b5d500ef5649d4caa91e9e344ff46 Mon Sep 17 00:00:00 2001 From: Michael Goulet Date: Wed, 17 Apr 2024 21:58:27 -0400 Subject: [PATCH] Don't repeatedly duplicate TAIT lifetimes for each subsequently nested TAIT --- .../src/collect/generics_of.rs | 15 +++-- tests/ui/type-alias-impl-trait/variance.rs | 24 ++++++++ .../ui/type-alias-impl-trait/variance.stderr | 56 ++++++++++++++++++- 3 files changed, 88 insertions(+), 7 deletions(-) diff --git a/compiler/rustc_hir_analysis/src/collect/generics_of.rs b/compiler/rustc_hir_analysis/src/collect/generics_of.rs index 4d6a02f50bf..f83ddc51c76 100644 --- a/compiler/rustc_hir_analysis/src/collect/generics_of.rs +++ b/compiler/rustc_hir_analysis/src/collect/generics_of.rs @@ -195,16 +195,19 @@ pub(super) fn generics_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::Generics { } Some(fn_def_id.to_def_id()) } - ItemKind::OpaqueTy(hir::OpaqueTy { - origin: hir::OpaqueTyOrigin::TyAlias { .. }, + ItemKind::OpaqueTy(&hir::OpaqueTy { + origin: hir::OpaqueTyOrigin::TyAlias { parent, in_assoc_ty }, .. }) => { - let parent_id = tcx.hir().get_parent_item(hir_id); - assert_ne!(parent_id, hir::CRATE_OWNER_ID); - debug!("generics_of: parent of opaque ty {:?} is {:?}", def_id, parent_id); + if in_assoc_ty { + assert!(matches!(tcx.def_kind(parent), DefKind::AssocTy)); + } else { + assert!(matches!(tcx.def_kind(parent), DefKind::TyAlias)); + } + debug!("generics_of: parent of opaque ty {:?} is {:?}", def_id, parent); // Opaque types are always nested within another item, and // inherit the generics of the item. - Some(parent_id.to_def_id()) + Some(parent.to_def_id()) } _ => None, }, diff --git a/tests/ui/type-alias-impl-trait/variance.rs b/tests/ui/type-alias-impl-trait/variance.rs index 4b9fa67fd64..ba52eaa0359 100644 --- a/tests/ui/type-alias-impl-trait/variance.rs +++ b/tests/ui/type-alias-impl-trait/variance.rs @@ -52,4 +52,28 @@ impl<'i> Foo<'i> for () { //~^ ERROR: unconstrained opaque type } +trait Nesting<'a> { + type Output; +} +impl<'a> Nesting<'a> for &'a () { + type Output = &'a (); +} +type NestedDeeply<'a> = + impl Nesting< //~ [*, o] + 'a, + Output = impl Nesting< //~ [*, o] + 'a, + Output = impl Nesting< //~ [*, o] + 'a, + Output = impl Nesting< //~ [*, o] + 'a, + Output = impl Nesting<'a> //~ [*, o] + > + >, + >, + >; +fn test<'a>() -> NestedDeeply<'a> { + &() +} + fn main() {} diff --git a/tests/ui/type-alias-impl-trait/variance.stderr b/tests/ui/type-alias-impl-trait/variance.stderr index 1aaf36223b7..e5ced7a4981 100644 --- a/tests/ui/type-alias-impl-trait/variance.stderr +++ b/tests/ui/type-alias-impl-trait/variance.stderr @@ -176,6 +176,60 @@ error: [*, *, o, o] LL | type ExplicitCaptureFromGat<'a> = impl Sized + Captures<'a>; | ^^^^^^^^^^^^^^^^^^^^^^^^^ -error: aborting due to 24 previous errors +error: [*, o] + --> $DIR/variance.rs:62:5 + | +LL | / impl Nesting< +LL | | 'a, +LL | | Output = impl Nesting< +LL | | 'a, +... | +LL | | >, +LL | | >; + | |_____^ + +error: [*, o] + --> $DIR/variance.rs:64:18 + | +LL | Output = impl Nesting< + | __________________^ +LL | | 'a, +LL | | Output = impl Nesting< +LL | | 'a, +... | +LL | | >, +LL | | >, + | |_________^ + +error: [*, o] + --> $DIR/variance.rs:66:22 + | +LL | Output = impl Nesting< + | ______________________^ +LL | | 'a, +LL | | Output = impl Nesting< +LL | | 'a, +LL | | Output = impl Nesting<'a> +LL | | > +LL | | >, + | |_____________^ + +error: [*, o] + --> $DIR/variance.rs:68:26 + | +LL | Output = impl Nesting< + | __________________________^ +LL | | 'a, +LL | | Output = impl Nesting<'a> +LL | | > + | |_________________^ + +error: [*, o] + --> $DIR/variance.rs:70:30 + | +LL | Output = impl Nesting<'a> + | ^^^^^^^^^^^^^^^^ + +error: aborting due to 29 previous errors For more information about this error, try `rustc --explain E0657`.