1 // run-pass
2 
3 #![allow(warnings)]
4 #![feature(in_band_lifetimes)]
5 
foo(x: &'x u8) -> &'x u86 fn foo(x: &'x u8) -> &'x u8 { x }
foo2(x: &'a u8, y: &u8) -> &'a u87 fn foo2(x: &'a u8, y: &u8) -> &'a u8 { x }
8 
check_in_band_can_be_late_bound()9 fn check_in_band_can_be_late_bound() {
10     let _: for<'x> fn(&'x u8, &u8) -> &'x u8 = foo2;
11 }
12 
13 struct ForInherentNoParams;
14 
15 impl ForInherentNoParams {
foo(x: &'a u32, y: &u32) -> &'a u3216     fn foo(x: &'a u32, y: &u32) -> &'a u32 { x }
17 }
18 
19 struct X<'a>(&'a u8);
20 
21 impl<'a> X<'a> {
inner(&self) -> &'a u822     fn inner(&self) -> &'a u8 {
23         self.0
24     }
25 
same_lifetime_as_parameter(&mut self, x: &'a u8)26     fn same_lifetime_as_parameter(&mut self, x: &'a u8) {
27         self.0 = x;
28     }
29 }
30 
31 impl X<'b> {
inner_2(&self) -> &'b u832     fn inner_2(&self) -> &'b u8 {
33         self.0
34     }
35 
reference_already_introduced_in_band_from_method_with_explicit_binders<'a>( &'b self, x: &'a u32 )36     fn reference_already_introduced_in_band_from_method_with_explicit_binders<'a>(
37         &'b self, x: &'a u32
38     ) {}
39 }
40 
41 struct Y<T>(T);
42 
43 impl Y<&'a u8> {
inner(&self) -> &'a u844     fn inner(&self) -> &'a u8 {
45         self.0
46     }
47 }
48 
49 trait MyTrait<'a> {
my_lifetime(&self) -> &'a u850     fn my_lifetime(&self) -> &'a u8;
any_lifetime() -> &'b u851     fn any_lifetime() -> &'b u8;
borrowed_lifetime(&'b self) -> &'b u852     fn borrowed_lifetime(&'b self) -> &'b u8;
default_impl(&self, x: &'b u32, y: &u32) -> &'b u3253     fn default_impl(&self, x: &'b u32, y: &u32) -> &'b u32 { x }
in_band_def_explicit_impl(&self, x: &'b u8)54     fn in_band_def_explicit_impl(&self, x: &'b u8);
55 }
56 
57 impl MyTrait<'a> for Y<&'a u8> {
my_lifetime(&self) -> &'a u858     fn my_lifetime(&self) -> &'a u8 { self.0 }
any_lifetime() -> &'b u859     fn any_lifetime() -> &'b u8 { &0 }
borrowed_lifetime(&'b self) -> &'b u860     fn borrowed_lifetime(&'b self) -> &'b u8 { &*self.0 }
in_band_def_explicit_impl<'b>(&self, x: &'b u8)61     fn in_band_def_explicit_impl<'b>(&self, x: &'b u8) {}
62 }
63 
test_hrtb_defined_lifetime_where<F>(_: F) where for<'a> F: Fn(&'a u8)64 fn test_hrtb_defined_lifetime_where<F>(_: F) where for<'a> F: Fn(&'a u8) {}
test_hrtb_defined_lifetime_polytraitref<F>(_: F) where F: for<'a> Fn(&'a u8)65 fn test_hrtb_defined_lifetime_polytraitref<F>(_: F) where F: for<'a> Fn(&'a u8) {}
66 
reference_in_band_from_locals(x: &'test u32) -> &'test u3267 fn reference_in_band_from_locals(x: &'test u32) -> &'test u32 {
68     let y: &'test u32 = x;
69     y
70 }
71 
in_generics_in_band<T: MyTrait<'a>>(x: &T)72 fn in_generics_in_band<T: MyTrait<'a>>(x: &T) {}
where_clause_in_band<T>(x: &T) where T: MyTrait<'a>73 fn where_clause_in_band<T>(x: &T) where T: MyTrait<'a> {}
impl_trait_in_band(x: &impl MyTrait<'a>)74 fn impl_trait_in_band(x: &impl MyTrait<'a>) {}
75 
76 // Tests around using in-band lifetimes within existential traits.
77 
78 trait FunkyTrait<'a> { }
79 impl<'a, T> FunkyTrait<'a> for T { }
ret_pos_impl_trait_in_band_outlives(x: &'a u32) -> impl ::std::fmt::Debug + 'a80 fn ret_pos_impl_trait_in_band_outlives(x: &'a u32) -> impl ::std::fmt::Debug + 'a {
81     x
82 }
ret_pos_impl_trait_in_band_param(x: &'a u32) -> impl FunkyTrait<'a>83 fn ret_pos_impl_trait_in_band_param(x: &'a u32) -> impl FunkyTrait<'a> {
84     x
85 }
ret_pos_impl_trait_in_band_param_static(x: &'a u32) -> impl FunkyTrait<'static> + 'a86 fn ret_pos_impl_trait_in_band_param_static(x: &'a u32) -> impl FunkyTrait<'static> + 'a {
87     x
88 }
ret_pos_impl_trait_in_band_param_outlives(x: &'a u32) -> impl FunkyTrait<'a> + 'a89 fn ret_pos_impl_trait_in_band_param_outlives(x: &'a u32) -> impl FunkyTrait<'a> + 'a {
90     x
91 }
ret_pos_impl_trait_in_band_higher_ranked(x: &'a u32) -> impl for<'b> FunkyTrait<'b> + 'a92 fn ret_pos_impl_trait_in_band_higher_ranked(x: &'a u32) -> impl for<'b> FunkyTrait<'b> + 'a {
93     x
94 }
95 
main()96 fn main() {}
97