diff options
Diffstat (limited to 'tests/ui/nll/user-annotations/normalization-2.rs')
-rw-r--r-- | tests/ui/nll/user-annotations/normalization-2.rs | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/tests/ui/nll/user-annotations/normalization-2.rs b/tests/ui/nll/user-annotations/normalization-2.rs new file mode 100644 index 000000000..be23c3b74 --- /dev/null +++ b/tests/ui/nll/user-annotations/normalization-2.rs @@ -0,0 +1,152 @@ +// 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() {} |