// ignore-tidy-linelength

pub type Ty0 = dyn for<'any> FnOnce(&'any str) -> bool;

pub type Ty1<'obj> = dyn std::fmt::Display + 'obj;

pub type Ty2 = dyn for<'a, 'r> Container<'r, Item<'a, 'static> = ()>;

pub type Ty3<'s> = &'s dyn ToString;

pub trait Container<'r> {
    type Item<'a, 'ctx>;
}

// Trait-object types inside of a container type that has lifetime bounds ("wrapped").

pub fn late_bound_wrapped_elided(_: &(dyn Fn() + '_)) {}
pub fn late_bound_wrapped_late0<'f>(_: &mut (dyn Fn() + 'f)) {}
pub fn late_bound_wrapped_defaulted0<'f>(_: &'f mut dyn Fn()) {}
pub type EarlyBoundWrappedDefaulted0<'x> = std::cell::Ref<'x, dyn Trait>;
pub type EarlyBoundWrappedDefaulted1<'x> = &'x dyn Trait;
pub type EarlyBoundWrappedEarly<'x, 'y> = std::cell::Ref<'x, dyn Trait + 'y>;
pub type EarlyBoundWrappedStatic<'x> = std::cell::Ref<'x, dyn Trait + 'static>;
pub fn late_bound_wrapped_defaulted1<'l>(_: std::cell::Ref<'l, dyn Trait>) {}
pub fn late_bound_wrapped_late1<'l, 'm>(_: std::cell::Ref<'l, dyn Trait + 'm>) {}
pub fn late_bound_wrapped_early<'e, 'l>(_: std::cell::Ref<'l, dyn Trait + 'e>) where 'e: {} // `'e` is early-bound
pub fn elided_bound_wrapped_defaulted(_: std::cell::Ref<'_, dyn Trait>) {}
pub type StaticBoundWrappedDefaulted0 = std::cell::Ref<'static, dyn Trait>;
pub type StaticBoundWrappedDefaulted1 = &'static dyn Trait;
pub type AmbiguousBoundWrappedEarly0<'r, 's> = AmbiguousBoundWrapper<'s, 'r, dyn Trait + 's>;
pub type AmbiguousBoundWrappedEarly1<'r, 's> = AmbiguousBoundWrapper<'s, 'r, dyn Trait + 'r>;
pub type AmbiguousBoundWrappedStatic<'q> = AmbiguousBoundWrapper<'q, 'q, dyn Trait + 'static>;

// Trait-object types inside of a container type that doesn't have lifetime bounds ("wrapped").

pub type NoBoundsWrappedDefaulted = Box<dyn Trait>;
pub type NoBoundsWrappedEarly<'e> = Box<dyn Trait + 'e>;
pub fn no_bounds_wrapped_late<'l>(_: Box<dyn Trait + 'l>) {}
pub fn no_bounds_wrapped_elided(_: Box<dyn Trait + '_>) {}

// Trait-object types outside of a container (“bare”).

pub type BareNoBoundsDefaulted = dyn Trait;
pub type BareNoBoundsEarly<'p> = dyn Trait + 'p;
pub type BareEarlyBoundDefaulted0<'u> = dyn EarlyBoundTrait0<'u>;
pub type BareEarlyBoundDefaulted1 = dyn for<'any> EarlyBoundTrait0<'any>;
pub type BareEarlyBoundDefaulted2<'w> = dyn EarlyBoundTrait1<'static, 'w>;
pub type BareEarlyBoundEarly<'i, 'j> = dyn EarlyBoundTrait0<'i> + 'j;
pub type BareEarlyBoundStatic<'i> = dyn EarlyBoundTrait0<'i> + 'static;
pub type BareStaticBoundDefaulted = dyn StaticBoundTrait;
pub type BareHigherRankedBoundDefaulted0 = dyn HigherRankedBoundTrait0;
pub type BareHigherRankedBoundDefaulted1<'r> = dyn HigherRankedBoundTrait1<'r>;
pub type BareAmbiguousBoundEarly0<'m, 'n> = dyn AmbiguousBoundTrait<'m, 'n> + 'm;
pub type BareAmbiguousBoundEarly1<'m, 'n> = dyn AmbiguousBoundTrait<'m, 'n> + 'n;
pub type BareAmbiguousBoundStatic<'o> = dyn AmbiguousBoundTrait<'o, 'o> + 'static;

// Trait and container definitions.

pub trait Trait {} // no bounds
pub trait EarlyBoundTrait0<'b>: 'b {}
pub trait EarlyBoundTrait1<'unused, 'c>: 'c {}
pub trait StaticBoundTrait: 'static {}
pub trait HigherRankedBoundTrait0 where for<'a> Self: 'a {}
pub trait HigherRankedBoundTrait1<'e> where for<'l> Self: 'e + 'l {}
pub trait AmbiguousBoundTrait<'a, 'b>: 'a + 'b {}

pub struct AmbiguousBoundWrapper<'a, 'b, T: ?Sized + 'a + 'b>(&'a T, &'b T);

// Trait objects inside of another trait object, a trait bound or an associated type.

pub trait Inner {}
pub trait Outer<T: ?Sized> {}
pub trait Base {
    type Type<T: ?Sized>;
}
impl Base for () {
    type Type<T: ?Sized> = ();
}

pub type NestedTraitObjects = dyn Outer<dyn Inner>;

pub fn apit_rpit(o: impl Outer<dyn Inner>) -> impl Outer<dyn Inner> {
    o
}

pub type AssocTy = <() as Base>::Type<dyn Inner>;
