Don't repeatedly duplicate TAIT lifetimes for each subsequently nested TAIT

This commit is contained in:
Michael Goulet 2024-04-17 21:58:27 -04:00
parent 00ed4edb44
commit ffb4206577
3 changed files with 88 additions and 7 deletions

View File

@ -195,16 +195,19 @@ pub(super) fn generics_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::Generics {
} }
Some(fn_def_id.to_def_id()) Some(fn_def_id.to_def_id())
} }
ItemKind::OpaqueTy(hir::OpaqueTy { ItemKind::OpaqueTy(&hir::OpaqueTy {
origin: hir::OpaqueTyOrigin::TyAlias { .. }, origin: hir::OpaqueTyOrigin::TyAlias { parent, in_assoc_ty },
.. ..
}) => { }) => {
let parent_id = tcx.hir().get_parent_item(hir_id); if in_assoc_ty {
assert_ne!(parent_id, hir::CRATE_OWNER_ID); assert!(matches!(tcx.def_kind(parent), DefKind::AssocTy));
debug!("generics_of: parent of opaque ty {:?} is {:?}", def_id, parent_id); } 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 // Opaque types are always nested within another item, and
// inherit the generics of the item. // inherit the generics of the item.
Some(parent_id.to_def_id()) Some(parent.to_def_id())
} }
_ => None, _ => None,
}, },

View File

@ -52,4 +52,28 @@ impl<'i> Foo<'i> for () {
//~^ ERROR: unconstrained opaque type //~^ 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() {} fn main() {}

View File

@ -176,6 +176,60 @@ error: [*, *, o, o]
LL | type ExplicitCaptureFromGat<'a> = impl Sized + Captures<'a>; 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`. For more information about this error, try `rustc --explain E0657`.