// Normally we do not allow equal lifetimes in opaque type generic args at // their defining sites. An exception to this rule, however, is when the bounds // of the opaque type *require* the lifetimes to be equal. // issue: #113916 //@ check-pass #![feature(type_alias_impl_trait)] #![feature(impl_trait_in_assoc_type)] trait Trait<'a, 'b> {} impl Trait<'_, '_> for T {} mod equal_params { type Opaque<'a: 'b, 'b: 'a> = impl super::Trait<'a, 'b>; #[define_opaque(Opaque)] fn test<'a: 'b, 'b: 'a>() -> Opaque<'a, 'b> { let _ = None::<&'a &'b &'a ()>; 0u8 } } mod equal_static { type Opaque<'a: 'static> = impl Sized + 'a; #[define_opaque(Opaque)] fn test<'a: 'static>() -> Opaque<'a> { let _ = None::<&'static &'a ()>; 0u8 } } mod implied_bounds { trait Traitor { type Assoc; fn define(self) -> Self::Assoc; } impl<'a> Traitor for &'static &'a () { type Assoc = impl Sized + 'a; fn define(self) -> Self::Assoc { let _ = None::<&'static &'a ()>; 0u8 } } impl<'a, 'b> Traitor for (&'a &'b (), &'b &'a ()) { type Assoc = impl Sized + 'a + 'b; fn define(self) -> Self::Assoc { let _ = None::<(&'a &'b (), &'b &'a ())>; 0u8 } } } fn main() {}