| // Make sure we honor region constraints when normalizing type annotations. | |
| //@ check-fail | |
| #![feature(more_qualified_paths)] | |
| trait Trait { | |
| type Assoc; | |
| } | |
| impl<T> Trait for T | |
| where | |
| T: 'static, | |
| { | |
| type Assoc = MyTy<()>; | |
| } | |
| enum MyTy<T> { | |
| Unit, | |
| Tuple(), | |
| Struct {}, | |
| Dumb(T), | |
| } | |
| impl<T> MyTy<T> { | |
| const CONST: () = (); | |
| fn method<X>() {} | |
| fn method2<X>(&self) {} | |
| } | |
| trait TraitAssoc { | |
| const TRAIT_CONST: (); | |
| fn trait_method<X>(&self); | |
| } | |
| impl<T> TraitAssoc for T { | |
| const TRAIT_CONST: () = (); | |
| fn trait_method<X>(&self) {} | |
| } | |
| type Ty<'a> = <&'a () as Trait>::Assoc; | |
| fn test_local<'a>() { | |
| let _: Ty<'a> = MyTy::Unit; | |
| //~^ ERROR lifetime may not live long enough | |
| } | |
| fn test_closure_sig<'a, 'b>() { | |
| |_: Ty<'a>| {}; | |
| //~^ ERROR lifetime may not live long enough | |
| || -> Option<Ty<'b>> { None }; | |
| //~^ ERROR lifetime may not live long enough | |
| } | |
| fn test_path<'a, 'b, 'c, 'd, 'e, 'f, 'g, 'h>() { | |
| <Ty<'a>>::method::<Ty<'static>>; | |
| //~^ ERROR lifetime may not live long enough | |
| <Ty<'static>>::method::<Ty<'b>>; | |
| //~^ ERROR lifetime may not live long enough | |
| <Ty<'c>>::trait_method::<Ty<'static>>; | |
| //~^ ERROR lifetime may not live long enough | |
| <Ty<'static>>::trait_method::<Ty<'d>>; | |
| //~^ ERROR lifetime may not live long enough | |
| <Ty<'e>>::CONST; | |
| //~^ ERROR lifetime may not live long enough | |
| <Ty<'f>>::TRAIT_CONST; | |
| //~^ ERROR lifetime may not live long enough | |
| <Ty<'static>>::method::<Ty<'static>>; | |
| <Ty<'static>>::trait_method::<Ty<'static>>; | |
| <Ty<'static>>::CONST; | |
| <Ty<'static>>::TRAIT_CONST; | |
| MyTy::Unit::<Ty<'g>>; | |
| //~^ ERROR lifetime may not live long enough | |
| MyTy::<Ty<'h>>::Unit; | |
| //~^ ERROR lifetime may not live long enough | |
| } | |
| fn test_call<'a, 'b, 'c>() { | |
| <Ty<'a>>::method::<Ty<'static>>(); | |
| //~^ ERROR lifetime may not live long enough | |
| <Ty<'static>>::method::<Ty<'b>>(); | |
| //~^ ERROR lifetime may not live long enough | |
| } | |
| fn test_variants<'a, 'b, 'c>() { | |
| <Ty<'a>>::Struct {}; | |
| //~^ ERROR lifetime may not live long enough | |
| <Ty<'b>>::Tuple(); | |
| //~^ ERROR lifetime may not live long enough | |
| <Ty<'c>>::Unit; | |
| //~^ ERROR lifetime may not live long enough | |
| } | |
| fn test_method_call<'a, 'b>(x: MyTy<()>) { | |
| x.method2::<Ty<'a>>(); | |
| //~^ ERROR lifetime may not live long enough | |
| x.trait_method::<Ty<'b>>(); | |
| //~^ ERROR lifetime may not live long enough | |
| } | |
| fn test_struct_path<'a, 'b, 'c, 'd>() { | |
| struct Struct<T> { x: Option<T>, } | |
| trait Project { | |
| type Struct; | |
| type Enum; | |
| } | |
| impl<T> Project for T { | |
| type Struct = Struct<()>; | |
| type Enum = MyTy<()>; | |
| } | |
| // Resolves to enum variant | |
| MyTy::<Ty<'a>>::Struct {}; // without SelfTy | |
| //~^ ERROR lifetime may not live long enough | |
| <Ty<'b> as Project>::Enum::Struct {}; // with SelfTy | |
| //~^ ERROR lifetime may not live long enough | |
| // Resolves to struct and associated type respectively | |
| Struct::<Ty<'c>> { x: None, }; // without SelfTy | |
| //~^ ERROR lifetime may not live long enough | |
| <Ty<'d> as Project>::Struct { x: None, }; // with SelfTy | |
| //~^ ERROR lifetime may not live long enough | |
| } | |
| fn test_pattern<'a, 'b, 'c, 'd, 'e, 'f>() { | |
| use MyTy::*; | |
| match MyTy::Unit { | |
| Struct::<Ty<'a>> {..} => {}, | |
| //~^ ERROR lifetime may not live long enough | |
| Tuple::<Ty<'b>> (..) => {}, | |
| //~^ ERROR lifetime may not live long enough | |
| Unit::<Ty<'c>> => {}, | |
| //~^ ERROR lifetime may not live long enough | |
| Dumb(_) => {}, | |
| }; | |
| match MyTy::Unit { | |
| <Ty<'d>>::Struct {..} => {}, | |
| //~^ ERROR lifetime may not live long enough | |
| <Ty<'e>>::Tuple (..) => {}, | |
| //~^ ERROR lifetime may not live long enough | |
| <Ty<'f>>::Unit => {}, | |
| //~^ ERROR lifetime may not live long enough | |
| Dumb(_) => {}, | |
| }; | |
| } | |
| fn main() {} |