#![feature(rustc_attrs, type_alias_impl_trait, impl_trait_in_assoc_type)] #![allow(internal_features)] #![rustc_variance_of_opaques] trait Captures<'a> {} impl Captures<'_> for T {} type NotCapturedEarly<'a> = impl Sized; //~ ERROR ['a: *, 'a: o] //~^ ERROR: unconstrained opaque type type CapturedEarly<'a> = impl Sized + Captures<'a>; //~ ERROR ['a: *, 'a: o] //~^ ERROR: unconstrained opaque type type NotCapturedLate<'a> = dyn for<'b> Iterator; //~ ERROR ['a: *, 'a: o, 'b: o] //~^ ERROR `impl Trait` cannot capture higher-ranked lifetime from `dyn` type //~| ERROR: unconstrained opaque type type Captured<'a> = dyn for<'b> Iterator>; //~ ERROR ['a: *, 'a: o, 'b: o] //~^ ERROR `impl Trait` cannot capture higher-ranked lifetime from `dyn` type //~| ERROR: unconstrained opaque type type Bar<'a, 'b: 'b, T> = impl Sized; //~ ERROR ['a: *, 'b: *, T: o, 'a: o, 'b: o] //~^ ERROR: unconstrained opaque type trait Foo<'i> { type ImplicitCapture<'a>; type ExplicitCaptureFromHeader<'a>; type ExplicitCaptureFromGat<'a>; } impl<'i> Foo<'i> for &'i () { type ImplicitCapture<'a> = impl Sized; //~ ERROR ['i: *, 'a: *, 'i: o, 'a: o] //~^ ERROR: unconstrained opaque type type ExplicitCaptureFromHeader<'a> = impl Sized + Captures<'i>; //~ ERROR ['i: *, 'a: *, 'i: o, 'a: o] //~^ ERROR: unconstrained opaque type type ExplicitCaptureFromGat<'a> = impl Sized + Captures<'a>; //~ ERROR ['i: *, 'a: *, 'i: o, 'a: o] //~^ ERROR: unconstrained opaque type } impl<'i> Foo<'i> for () { type ImplicitCapture<'a> = impl Sized; //~ ERROR ['i: *, 'a: *, 'i: o, 'a: o] //~^ ERROR: unconstrained opaque type type ExplicitCaptureFromHeader<'a> = impl Sized + Captures<'i>; //~ ERROR ['i: *, 'a: *, 'i: o, 'a: o] //~^ ERROR: unconstrained opaque type type ExplicitCaptureFromGat<'a> = impl Sized + Captures<'a>; //~ ERROR ['i: *, 'a: *, 'i: o, 'a: o] //~^ ERROR: unconstrained opaque type } trait Nesting<'a> { type Output; } impl<'a> Nesting<'a> for &'a () { type Output = &'a (); } type NestedDeeply<'a> = impl Nesting< //~ ERROR ['a: *, 'a: o] 'a, Output = impl Nesting< //~ ERROR ['a: *, 'a: o] 'a, Output = impl Nesting< //~ ERROR ['a: *, 'a: o] 'a, Output = impl Nesting< //~ ERROR ['a: *, 'a: o] 'a, Output = impl Nesting<'a> //~ ERROR ['a: *, 'a: o] > >, >, >; #[define_opaque(NestedDeeply)] fn test<'a>() -> NestedDeeply<'a> { &() } fn main() {}