// issue: #111935 #![allow(unconditional_recursion)] // Lt indirection is necessary to make the lifetime of the function late-bound, // in order to bypass some other bugs. type Lt<'lt> = Option<*mut &'lt ()>; mod statik { use super::*; // invalid defining use: Opaque<'static> := () fn foo<'a>(_: Lt<'a>) -> impl Sized + 'a { let _: () = foo(Lt::<'static>::None); //~^ ERROR expected generic lifetime parameter, found `'static` } } mod infer { use super::*; // invalid defining use: Opaque<'_> := () fn foo<'a>(_: Lt<'a>) -> impl Sized + 'a { let _: () = foo(Lt::<'_>::None); //~^ ERROR expected generic lifetime parameter, found `'_` } } mod equal { use super::*; // invalid defining use: Opaque<'a, 'a> := () // because of the use of equal lifetimes in args fn foo<'a, 'b>(_: Lt<'a>, _: Lt<'b>) -> impl Sized + 'a + 'b { let _: () = foo(Lt::<'a>::None, Lt::<'a>::None); //~^ ERROR non-defining opaque type use in defining scope } } fn main() {}