summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/test/ui/nll/user-annotations/normalization-2.rs46
-rw-r--r--src/test/ui/nll/user-annotations/normalization-2.stderr152
-rw-r--r--src/test/ui/nll/user-annotations/normalization.rs9
-rw-r--r--src/test/ui/nll/user-annotations/normalization.stderr18
-rw-r--r--src/test/ui/type-alias-impl-trait/associated-type-impl-trait-lifetime.rs20
5 files changed, 208 insertions, 37 deletions
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<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>() {
@@ -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>() {
<Ty<'a>>::method::<Ty<'static>>;
//~^ ERROR lifetime may not live long enough
<Ty<'static>>::method::<Ty<'b>>;
//~^ ERROR lifetime may not live long enough
- MyTy::Unit::<Ty<'c>>;
+ <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
}
@@ -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::<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>() {
@@ -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::<Ty<'a>> {..} => {},
@@ -108,6 +137,15 @@ fn test_pattern<'a, 'b, '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(_) => {},
+ };
}
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 | <Ty<'a>>::method::<Ty<'static>>;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 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 | <Ty<'static>>::method::<Ty<'b>>;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 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::<Ty<'c>>;
- | ^^^^^^^^^^^^^^^^^^^^ requires that `'c` must outlive `'static`
+LL | <Ty<'c>>::trait_method::<Ty<'static>>;
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 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 | <Ty<'static>>::trait_method::<Ty<'d>>;
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 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 | <Ty<'e>>::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 | <Ty<'f>>::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::<Ty<'g>>;
+ | ^^^^^^^^^^^^^^^^^^^^ 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::<Ty<'h>>::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 | <Ty<'a>>::method::<Ty<'static>>();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 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 | <Ty<'a>>::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 | <Ty<'b>>::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::<Ty<'a>>();
| ^^^^^^^ 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::<Ty<'b>>();
+ | ^^^^^^^^^^^^ 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::<Ty<'a>>::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 | <Ty<'b> 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::<Ty<'c>> { 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::<Ty<'a>> {..} => {},
| ^^^^^^^^^^^^^^^^^^^^^ 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::<Ty<'b>> (..) => {},
| ^^^^^^^^^^^^^^^^^^^^ 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::<Ty<'c>> => {},
| ^^^^^^^^^^^^^^ 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 | <Ty<'d>>::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 | <Ty<'e>>::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 | <Ty<'f>>::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() {}