//@ pretty-compare-only //@ pretty-mode:hir //@ pp-exact:hir-lifetimes.pp // This tests the pretty-printing of lifetimes in lots of ways. #![allow(unused)] struct Foo<'a> { x: &'a u32, } impl<'a> Foo<'a> { fn f<'b>(x: &'b u32) {} } impl Foo<'_> { fn a(x: &u32) {} fn b(x: &'_ u32) {} fn c(x: &'_ u32, y: &'static u32) {} // FIXME: `'a` before `self` is omitted fn d<'a>(&'a self, x: &'a u32) {} // FIXME: impl Traits printed as just `/*impl Trait*/`, ugh fn iter1<'a>(&self) -> impl Iterator + 'a { 0..1 } fn iter2(&self) -> impl Iterator + '_ { 0..1 } } fn a(x: Foo<'_>) {} fn b<'a>(x: Foo<'a>) {} struct Bar<'a, 'b, 'c, T> { x: &'a u32, y: &'b &'c u32, z: T, } fn f1<'a, 'b, T>(x: Bar<'a, 'b, '_, T>) {} fn f2(x: Bar<'_, '_, '_, u32>) {} trait MyTrait<'a, 'b> { fn f(&self, x: Foo<'a>, y: Foo<'b>); } impl<'a, 'b, 'c, T> MyTrait<'a, 'b> for Bar<'a, 'b, 'c, T> { fn f(&self, x: Foo<'a>, y: Foo<'b>) {} } fn g(x: &dyn for<'a, 'b> MyTrait<'a, 'b>) {} trait Blah {} type T<'a> = dyn Blah + 'a; type Q<'a> = dyn MyTrait<'a, 'a> + 'a; fn h<'b, F>(f: F, y: Foo<'b>) where F: for<'d> MyTrait<'d, 'b> {} // FIXME(?): attr printing is weird #[repr(C)] struct S<'a>(&'a u32); extern "C" { fn g1(s: S); fn g2(s: S<'_>); fn g3<'a>(s: S<'a>); } struct St<'a> { x: &'a u32 } fn f() { _ = St { x: &0 }; _ = St::<'_> { x: &0 }; } struct Name<'a>(&'a str); const A: Name = Name("a"); const B: &str = ""; static C: &'_ str = ""; static D: &'static str = ""; fn tr(_: Box) {} fn main() {}