|  | //@ 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<Item = u32> + 'a { 0..1 } | 
|  |  | 
|  | fn iter2(&self) -> impl Iterator<Item = u32> + '_ { 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<dyn Blah>) {} | 
|  |  | 
|  | fn main() {} |