diff --git a/src/test/ui/nll/user-annotations/normalization-2.rs b/src/test/ui/nll/user-annotations/normalization-2.rs index 232b957d51f..be23c3b7478 100644 --- a/src/test/ui/nll/user-annotations/normalization-2.rs +++ b/src/test/ui/nll/user-annotations/normalization-2.rs @@ -23,10 +23,20 @@ enum MyTy { } impl MyTy { + const CONST: () = (); fn method() {} fn method2(&self) {} } +trait TraitAssoc { + const TRAIT_CONST: (); + fn trait_method(&self); +} +impl TraitAssoc for T { + const TRAIT_CONST: () = (); + fn trait_method(&self) {} +} + type Ty<'a> = <&'a () as Trait>::Assoc; fn test_local<'a>() { @@ -41,13 +51,30 @@ fn test_closure_sig<'a, 'b>() { //~^ ERROR lifetime may not live long enough } -fn test_path<'a, 'b, 'c, 'd>() { +fn test_path<'a, 'b, 'c, 'd, 'e, 'f, 'g, 'h>() { >::method::>; //~^ ERROR lifetime may not live long enough >::method::>; //~^ ERROR lifetime may not live long enough - MyTy::Unit::>; + >::trait_method::>; + //~^ ERROR lifetime may not live long enough + >::trait_method::>; + //~^ ERROR lifetime may not live long enough + + >::CONST; + //~^ ERROR lifetime may not live long enough + >::TRAIT_CONST; + //~^ ERROR lifetime may not live long enough + + >::method::>; + >::trait_method::>; + >::CONST; + >::TRAIT_CONST; + + MyTy::Unit::>; + //~^ ERROR lifetime may not live long enough + MyTy::>::Unit; //~^ ERROR lifetime may not live long enough } @@ -67,9 +94,11 @@ fn test_variants<'a, 'b, 'c>() { //~^ ERROR lifetime may not live long enough } -fn test_method_call<'a>(x: MyTy<()>) { +fn test_method_call<'a, 'b>(x: MyTy<()>) { x.method2::>(); //~^ ERROR lifetime may not live long enough + x.trait_method::>(); + //~^ ERROR lifetime may not live long enough } fn test_struct_path<'a, 'b, 'c, 'd>() { @@ -97,7 +126,7 @@ fn test_struct_path<'a, 'b, 'c, 'd>() { //~^ ERROR lifetime may not live long enough } -fn test_pattern<'a, 'b, 'c>() { +fn test_pattern<'a, 'b, 'c, 'd, 'e, 'f>() { use MyTy::*; match MyTy::Unit { Struct::> {..} => {}, @@ -108,6 +137,15 @@ fn test_pattern<'a, 'b, 'c>() { //~^ ERROR lifetime may not live long enough Dumb(_) => {}, }; + match MyTy::Unit { + >::Struct {..} => {}, + //~^ ERROR lifetime may not live long enough + >::Tuple (..) => {}, + //~^ ERROR lifetime may not live long enough + >::Unit => {}, + //~^ ERROR lifetime may not live long enough + Dumb(_) => {}, + }; } diff --git a/src/test/ui/nll/user-annotations/normalization-2.stderr b/src/test/ui/nll/user-annotations/normalization-2.stderr index 50382cfd953..5299282ea15 100644 --- a/src/test/ui/nll/user-annotations/normalization-2.stderr +++ b/src/test/ui/nll/user-annotations/normalization-2.stderr @@ -1,5 +1,5 @@ error: lifetime may not live long enough - --> $DIR/normalization-2.rs:33:12 + --> $DIR/normalization-2.rs:43:12 | LL | fn test_local<'a>() { | -- lifetime `'a` defined here @@ -7,7 +7,7 @@ LL | let _: Ty<'a> = MyTy::Unit; | ^^^^^^ requires that `'a` must outlive `'static` error: lifetime may not live long enough - --> $DIR/normalization-2.rs:38:6 + --> $DIR/normalization-2.rs:48:6 | LL | fn test_closure_sig<'a, 'b>() { | -- lifetime `'a` defined here @@ -15,7 +15,7 @@ LL | |_: Ty<'a>| {}; | ^ requires that `'a` must outlive `'static` error: lifetime may not live long enough - --> $DIR/normalization-2.rs:40:11 + --> $DIR/normalization-2.rs:50:11 | LL | fn test_closure_sig<'a, 'b>() { | -- lifetime `'b` defined here @@ -29,39 +29,89 @@ help: the following changes may resolve your lifetime errors = help: replace `'b` with `'static` error: lifetime may not live long enough - --> $DIR/normalization-2.rs:45:5 + --> $DIR/normalization-2.rs:55:5 | -LL | fn test_path<'a, 'b, 'c, 'd>() { +LL | fn test_path<'a, 'b, 'c, 'd, 'e, 'f, 'g, 'h>() { | -- lifetime `'a` defined here LL | >::method::>; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ requires that `'a` must outlive `'static` error: lifetime may not live long enough - --> $DIR/normalization-2.rs:47:5 + --> $DIR/normalization-2.rs:57:5 | -LL | fn test_path<'a, 'b, 'c, 'd>() { +LL | fn test_path<'a, 'b, 'c, 'd, 'e, 'f, 'g, 'h>() { | -- lifetime `'b` defined here ... LL | >::method::>; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ requires that `'b` must outlive `'static` error: lifetime may not live long enough - --> $DIR/normalization-2.rs:50:5 + --> $DIR/normalization-2.rs:60:5 | -LL | fn test_path<'a, 'b, 'c, 'd>() { +LL | fn test_path<'a, 'b, 'c, 'd, 'e, 'f, 'g, 'h>() { | -- lifetime `'c` defined here ... -LL | MyTy::Unit::>; - | ^^^^^^^^^^^^^^^^^^^^ requires that `'c` must outlive `'static` +LL | >::trait_method::>; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ requires that `'c` must outlive `'static` + +error: lifetime may not live long enough + --> $DIR/normalization-2.rs:62:5 + | +LL | fn test_path<'a, 'b, 'c, 'd, 'e, 'f, 'g, 'h>() { + | -- lifetime `'d` defined here +... +LL | >::trait_method::>; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ requires that `'d` must outlive `'static` + +error: lifetime may not live long enough + --> $DIR/normalization-2.rs:65:5 + | +LL | fn test_path<'a, 'b, 'c, 'd, 'e, 'f, 'g, 'h>() { + | -- lifetime `'e` defined here +... +LL | >::CONST; + | ^^^^^^^^^^^^^^^ requires that `'e` must outlive `'static` + +error: lifetime may not live long enough + --> $DIR/normalization-2.rs:67:5 + | +LL | fn test_path<'a, 'b, 'c, 'd, 'e, 'f, 'g, 'h>() { + | -- lifetime `'f` defined here +... +LL | >::TRAIT_CONST; + | ^^^^^^^^^^^^^^^^^^^^^ requires that `'f` must outlive `'static` + +error: lifetime may not live long enough + --> $DIR/normalization-2.rs:75:5 + | +LL | fn test_path<'a, 'b, 'c, 'd, 'e, 'f, 'g, 'h>() { + | -- lifetime `'g` defined here +... +LL | MyTy::Unit::>; + | ^^^^^^^^^^^^^^^^^^^^ requires that `'g` must outlive `'static` + +error: lifetime may not live long enough + --> $DIR/normalization-2.rs:77:5 + | +LL | fn test_path<'a, 'b, 'c, 'd, 'e, 'f, 'g, 'h>() { + | -- lifetime `'h` defined here +... +LL | MyTy::>::Unit; + | ^^^^^^^^^^^^^^^^^^^^ requires that `'h` must outlive `'static` help: the following changes may resolve your lifetime errors | = help: replace `'a` with `'static` = help: replace `'b` with `'static` = help: replace `'c` with `'static` + = help: replace `'d` with `'static` + = help: replace `'e` with `'static` + = help: replace `'f` with `'static` + = help: replace `'g` with `'static` + = help: replace `'h` with `'static` error: lifetime may not live long enough - --> $DIR/normalization-2.rs:55:5 + --> $DIR/normalization-2.rs:82:5 | LL | fn test_call<'a, 'b, 'c>() { | -- lifetime `'a` defined here @@ -69,7 +119,7 @@ LL | >::method::>(); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ requires that `'a` must outlive `'static` error: lifetime may not live long enough - --> $DIR/normalization-2.rs:57:5 + --> $DIR/normalization-2.rs:84:5 | LL | fn test_call<'a, 'b, 'c>() { | -- lifetime `'b` defined here @@ -83,7 +133,7 @@ help: the following changes may resolve your lifetime errors = help: replace `'b` with `'static` error: lifetime may not live long enough - --> $DIR/normalization-2.rs:62:5 + --> $DIR/normalization-2.rs:89:5 | LL | fn test_variants<'a, 'b, 'c>() { | -- lifetime `'a` defined here @@ -91,7 +141,7 @@ LL | >::Struct {}; | ^^^^^^^^^^^^^^^^^^^ requires that `'a` must outlive `'static` error: lifetime may not live long enough - --> $DIR/normalization-2.rs:64:5 + --> $DIR/normalization-2.rs:91:5 | LL | fn test_variants<'a, 'b, 'c>() { | -- lifetime `'b` defined here @@ -100,7 +150,7 @@ LL | >::Tuple(); | ^^^^^^^^^^^^^^^ requires that `'b` must outlive `'static` error: lifetime may not live long enough - --> $DIR/normalization-2.rs:66:5 + --> $DIR/normalization-2.rs:93:5 | LL | fn test_variants<'a, 'b, 'c>() { | -- lifetime `'c` defined here @@ -115,15 +165,29 @@ help: the following changes may resolve your lifetime errors = help: replace `'c` with `'static` error: lifetime may not live long enough - --> $DIR/normalization-2.rs:71:7 + --> $DIR/normalization-2.rs:98:7 | -LL | fn test_method_call<'a>(x: MyTy<()>) { +LL | fn test_method_call<'a, 'b>(x: MyTy<()>) { | -- lifetime `'a` defined here LL | x.method2::>(); | ^^^^^^^ requires that `'a` must outlive `'static` error: lifetime may not live long enough - --> $DIR/normalization-2.rs:88:5 + --> $DIR/normalization-2.rs:100:7 + | +LL | fn test_method_call<'a, 'b>(x: MyTy<()>) { + | -- lifetime `'b` defined here +... +LL | x.trait_method::>(); + | ^^^^^^^^^^^^ requires that `'b` must outlive `'static` + +help: the following changes may resolve your lifetime errors + | + = help: replace `'a` with `'static` + = help: replace `'b` with `'static` + +error: lifetime may not live long enough + --> $DIR/normalization-2.rs:117:5 | LL | fn test_struct_path<'a, 'b, 'c, 'd>() { | -- lifetime `'a` defined here @@ -132,7 +196,7 @@ LL | MyTy::>::Struct {}; // without SelfTy | ^^^^^^^^^^^^^^^^^^^^^^^^^ requires that `'a` must outlive `'static` error: lifetime may not live long enough - --> $DIR/normalization-2.rs:90:5 + --> $DIR/normalization-2.rs:119:5 | LL | fn test_struct_path<'a, 'b, 'c, 'd>() { | -- lifetime `'b` defined here @@ -141,7 +205,7 @@ LL | as Project>::Enum::Struct {}; // with SelfTy | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ requires that `'b` must outlive `'static` error: lifetime may not live long enough - --> $DIR/normalization-2.rs:94:5 + --> $DIR/normalization-2.rs:123:5 | LL | fn test_struct_path<'a, 'b, 'c, 'd>() { | -- lifetime `'c` defined here @@ -150,7 +214,7 @@ LL | Struct::> { x: None, }; // without SelfTy | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ requires that `'c` must outlive `'static` error: lifetime may not live long enough - --> $DIR/normalization-2.rs:96:5 + --> $DIR/normalization-2.rs:125:5 | LL | fn test_struct_path<'a, 'b, 'c, 'd>() { | -- lifetime `'d` defined here @@ -166,37 +230,67 @@ help: the following changes may resolve your lifetime errors = help: replace `'d` with `'static` error: lifetime may not live long enough - --> $DIR/normalization-2.rs:103:9 + --> $DIR/normalization-2.rs:132:9 | -LL | fn test_pattern<'a, 'b, 'c>() { +LL | fn test_pattern<'a, 'b, 'c, 'd, 'e, 'f>() { | -- lifetime `'a` defined here ... LL | Struct::> {..} => {}, | ^^^^^^^^^^^^^^^^^^^^^ requires that `'a` must outlive `'static` error: lifetime may not live long enough - --> $DIR/normalization-2.rs:105:9 + --> $DIR/normalization-2.rs:134:9 | -LL | fn test_pattern<'a, 'b, 'c>() { +LL | fn test_pattern<'a, 'b, 'c, 'd, 'e, 'f>() { | -- lifetime `'b` defined here ... LL | Tuple::> (..) => {}, | ^^^^^^^^^^^^^^^^^^^^ requires that `'b` must outlive `'static` error: lifetime may not live long enough - --> $DIR/normalization-2.rs:107:9 + --> $DIR/normalization-2.rs:136:9 | -LL | fn test_pattern<'a, 'b, 'c>() { +LL | fn test_pattern<'a, 'b, 'c, 'd, 'e, 'f>() { | -- lifetime `'c` defined here ... LL | Unit::> => {}, | ^^^^^^^^^^^^^^ requires that `'c` must outlive `'static` +error: lifetime may not live long enough + --> $DIR/normalization-2.rs:141:9 + | +LL | fn test_pattern<'a, 'b, 'c, 'd, 'e, 'f>() { + | -- lifetime `'d` defined here +... +LL | >::Struct {..} => {}, + | ^^^^^^^^^^^^^^^^^^^^^ requires that `'d` must outlive `'static` + +error: lifetime may not live long enough + --> $DIR/normalization-2.rs:143:9 + | +LL | fn test_pattern<'a, 'b, 'c, 'd, 'e, 'f>() { + | -- lifetime `'e` defined here +... +LL | >::Tuple (..) => {}, + | ^^^^^^^^^^^^^^^^^^^^ requires that `'e` must outlive `'static` + +error: lifetime may not live long enough + --> $DIR/normalization-2.rs:145:9 + | +LL | fn test_pattern<'a, 'b, 'c, 'd, 'e, 'f>() { + | -- lifetime `'f` defined here +... +LL | >::Unit => {}, + | ^^^^^^^^^^^^^^ requires that `'f` must outlive `'static` + help: the following changes may resolve your lifetime errors | = help: replace `'a` with `'static` = help: replace `'b` with `'static` = help: replace `'c` with `'static` + = help: replace `'d` with `'static` + = help: replace `'e` with `'static` + = help: replace `'f` with `'static` -error: aborting due to 19 previous errors +error: aborting due to 28 previous errors diff --git a/src/test/ui/nll/user-annotations/normalization.rs b/src/test/ui/nll/user-annotations/normalization.rs index 870e3d8110c..c2e892f573c 100644 --- a/src/test/ui/nll/user-annotations/normalization.rs +++ b/src/test/ui/nll/user-annotations/normalization.rs @@ -3,8 +3,15 @@ trait Foo { type Out; } impl Foo for () { type Out = &'static u32; } +impl<'a> Foo for &'a () { type Out = &'a u32; } fn main() { let a = 22; - let b: <() as Foo>::Out = &a; //~ ERROR + let _: <() as Foo>::Out = &a; //~ ERROR + + let a = 22; + let _: <&'static () as Foo>::Out = &a; //~ ERROR + + let a = 22; + let _: <&'_ () as Foo>::Out = &a; } diff --git a/src/test/ui/nll/user-annotations/normalization.stderr b/src/test/ui/nll/user-annotations/normalization.stderr index 4c7893789a5..975cb4b66d9 100644 --- a/src/test/ui/nll/user-annotations/normalization.stderr +++ b/src/test/ui/nll/user-annotations/normalization.stderr @@ -1,13 +1,25 @@ error[E0597]: `a` does not live long enough - --> $DIR/normalization.rs:9:31 + --> $DIR/normalization.rs:10:31 | -LL | let b: <() as Foo>::Out = &a; +LL | let _: <() as Foo>::Out = &a; | ---------------- ^^ borrowed value does not live long enough | | | type annotation requires that `a` is borrowed for `'static` +... LL | } | - `a` dropped here while still borrowed -error: aborting due to previous error +error[E0597]: `a` does not live long enough + --> $DIR/normalization.rs:13:40 + | +LL | let _: <&'static () as Foo>::Out = &a; + | ------------------------- ^^ borrowed value does not live long enough + | | + | type annotation requires that `a` is borrowed for `'static` +... +LL | } + | - `a` dropped here while still borrowed + +error: aborting due to 2 previous errors For more information about this error, try `rustc --explain E0597`. diff --git a/src/test/ui/type-alias-impl-trait/associated-type-impl-trait-lifetime.rs b/src/test/ui/type-alias-impl-trait/associated-type-impl-trait-lifetime.rs new file mode 100644 index 00000000000..962606508be --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/associated-type-impl-trait-lifetime.rs @@ -0,0 +1,20 @@ +//check-pass + +#![feature(type_alias_impl_trait)] + +trait Trait { + type Opaque1; + type Opaque2; + fn constrain(self); +} + +impl<'a> Trait for &'a () { + type Opaque1 = impl Sized; + type Opaque2 = impl Sized + 'a; + fn constrain(self) { + let _: Self::Opaque1 = (); + let _: Self::Opaque2 = self; + } +} + +fn main() {}