]> git.lizzy.rs Git - rust.git/blob - src/test/ui/type-alias-impl-trait/underconstrained_lifetime.rs
Auto merge of #95454 - randomicon00:fix95444, r=wesleywiser
[rust.git] / src / test / ui / type-alias-impl-trait / underconstrained_lifetime.rs
1 #![feature(type_alias_impl_trait)]
2
3 use std::marker::PhantomData;
4
5 trait ProofForConversion<'a, 'b> {
6     fn convert<T: ?Sized>(_: PhantomData<Self>, r: &'a T) -> &'b T;
7 }
8
9 impl<'a, 'b> ProofForConversion<'a, 'b> for &'b &'a () {
10     fn convert<T: ?Sized>(_: PhantomData<Self>, r: &'a T) -> &'b T {
11         r
12     }
13 }
14
15 type Converter<'a, 'b> = impl ProofForConversion<'a, 'b>;
16 //~^ ERROR reference has a longer lifetime than the data it references
17
18 // Even _defining_use with an explicit `'a: 'b` compiles fine, too.
19 fn _defining_use<'a, 'b>(x: &'b &'a ()) -> Converter<'a, 'b> {
20     x
21 }
22
23 fn extend_lifetime<'a, 'b, T: ?Sized>(x: &'a T) -> &'b T {
24     Converter::<'a, 'b>::convert(PhantomData, x)
25 }
26
27 fn main() {
28     let d;
29     {
30         let x = "Hello World".to_string();
31         d = extend_lifetime(&x);
32     }
33     println!("{}", d);
34 }