summaryrefslogtreecommitdiffstats
path: root/tests/ui/suggestions/lifetimes
diff options
context:
space:
mode:
Diffstat (limited to 'tests/ui/suggestions/lifetimes')
-rw-r--r--tests/ui/suggestions/lifetimes/issue-105544.fixed14
-rw-r--r--tests/ui/suggestions/lifetimes/issue-105544.rs6
-rw-r--r--tests/ui/suggestions/lifetimes/issue-105544.stderr104
-rw-r--r--tests/ui/suggestions/lifetimes/missing-lifetimes-in-signature-2.fixed7
-rw-r--r--tests/ui/suggestions/lifetimes/missing-lifetimes-in-signature-2.rs7
-rw-r--r--tests/ui/suggestions/lifetimes/missing-lifetimes-in-signature-2.stderr23
-rw-r--r--tests/ui/suggestions/lifetimes/missing-lifetimes-in-signature.stderr99
-rw-r--r--tests/ui/suggestions/lifetimes/type-param-bound-scope.fixed47
-rw-r--r--tests/ui/suggestions/lifetimes/type-param-bound-scope.rs47
-rw-r--r--tests/ui/suggestions/lifetimes/type-param-bound-scope.stderr71
-rw-r--r--tests/ui/suggestions/lifetimes/type-param-missing-lifetime.fixed52
-rw-r--r--tests/ui/suggestions/lifetimes/type-param-missing-lifetime.rs52
-rw-r--r--tests/ui/suggestions/lifetimes/type-param-missing-lifetime.stderr66
13 files changed, 436 insertions, 159 deletions
diff --git a/tests/ui/suggestions/lifetimes/issue-105544.fixed b/tests/ui/suggestions/lifetimes/issue-105544.fixed
index 47087eb47..c92114e18 100644
--- a/tests/ui/suggestions/lifetimes/issue-105544.fixed
+++ b/tests/ui/suggestions/lifetimes/issue-105544.fixed
@@ -2,7 +2,7 @@
#![allow(warnings)]
-fn foo<'a>(d: impl Sized + 'a, p: &'a mut ()) -> impl Sized + '_ { //~ NOTE the parameter type `impl Sized` must be valid for the anonymous lifetime defined here...
+fn foo<'a>(d: impl Sized + 'a, p: &'a mut ()) -> impl Sized + 'a { //~ NOTE the parameter type `impl Sized` must be valid for the anonymous lifetime defined here...
//~^ HELP consider adding an explicit lifetime bound
(d, p)
//~^ ERROR the parameter type `impl Sized` may not live long enough
@@ -10,19 +10,20 @@ fn foo<'a>(d: impl Sized + 'a, p: &'a mut ()) -> impl Sized + '_ { //~ NOTE the
}
fn foo1<'b>(d: impl Sized + 'b, p: &'b mut ()) -> impl Sized + '_ {
-//~^ HELP consider adding an explicit lifetime bound...
+//~^ NOTE the parameter type `impl Sized` must be valid for the lifetime `'b` as defined here...
+//~| HELP consider adding an explicit lifetime bound
(d, p) //~ NOTE ...so that the type `impl Sized` will meet its required lifetime bounds
//~^ ERROR the parameter type `impl Sized` may not live long enough
}
-fn foo2<'b, 'a>(d: impl Sized + 'a + 'b, p: &'b mut ()) -> impl Sized + '_ { //~ NOTE the parameter type `impl Sized + 'a` must be valid for the anonymous lifetime defined here...
+fn foo2<'b, 'a>(d: impl Sized + 'a + 'b, p: &'b mut ()) -> impl Sized + 'b { //~ NOTE the parameter type `impl Sized + 'a` must be valid for the anonymous lifetime defined here...
//~^ HELP consider adding an explicit lifetime bound
(d, p)
//~^ ERROR the parameter type `impl Sized + 'a` may not live long enough
//~| NOTE ...so that the type `impl Sized + 'a` will meet its required lifetime bounds
}
-fn bar<'a, T : Sized + 'a>(d: T, p: &'a mut ()) -> impl Sized + '_ { //~ NOTE the parameter type `T` must be valid for the anonymous lifetime defined here...
+fn bar<'a, T : Sized + 'a>(d: T, p: &'a mut ()) -> impl Sized + 'a { //~ NOTE the parameter type `T` must be valid for the anonymous lifetime defined here...
//~^ HELP consider adding an explicit lifetime bound
(d, p)
//~^ ERROR the parameter type `T` may not live long enough
@@ -30,12 +31,13 @@ fn bar<'a, T : Sized + 'a>(d: T, p: &'a mut ()) -> impl Sized + '_ { //~ NOTE th
}
fn bar1<'b, T : Sized + 'b>(d: T, p: &'b mut ()) -> impl Sized + '_ {
-//~^ HELP consider adding an explicit lifetime bound...
+//~^ NOTE the parameter type `T` must be valid for the lifetime `'b` as defined here...
+//~| HELP consider adding an explicit lifetime bound
(d, p) //~ NOTE ...so that the type `T` will meet its required lifetime bounds
//~^ ERROR the parameter type `T` may not live long enough
}
-fn bar2<'b, 'a, T : Sized + 'a + 'b>(d: T, p: &'b mut ()) -> impl Sized + '_ { //~ NOTE the parameter type `T` must be valid for the anonymous lifetime defined here...
+fn bar2<'b, 'a, T : Sized + 'a + 'b>(d: T, p: &'b mut ()) -> impl Sized + 'b { //~ NOTE the parameter type `T` must be valid for the anonymous lifetime defined here...
//~^ HELP consider adding an explicit lifetime bound
(d, p)
//~^ ERROR the parameter type `T` may not live long enough
diff --git a/tests/ui/suggestions/lifetimes/issue-105544.rs b/tests/ui/suggestions/lifetimes/issue-105544.rs
index bd3bc1ef9..bbd0f097f 100644
--- a/tests/ui/suggestions/lifetimes/issue-105544.rs
+++ b/tests/ui/suggestions/lifetimes/issue-105544.rs
@@ -10,7 +10,8 @@ fn foo(d: impl Sized, p: &mut ()) -> impl Sized + '_ { //~ NOTE the parameter ty
}
fn foo1<'b>(d: impl Sized, p: &'b mut ()) -> impl Sized + '_ {
-//~^ HELP consider adding an explicit lifetime bound...
+//~^ NOTE the parameter type `impl Sized` must be valid for the lifetime `'b` as defined here...
+//~| HELP consider adding an explicit lifetime bound
(d, p) //~ NOTE ...so that the type `impl Sized` will meet its required lifetime bounds
//~^ ERROR the parameter type `impl Sized` may not live long enough
}
@@ -30,7 +31,8 @@ fn bar<T : Sized>(d: T, p: & mut ()) -> impl Sized + '_ { //~ NOTE the parameter
}
fn bar1<'b, T : Sized>(d: T, p: &'b mut ()) -> impl Sized + '_ {
-//~^ HELP consider adding an explicit lifetime bound...
+//~^ NOTE the parameter type `T` must be valid for the lifetime `'b` as defined here...
+//~| HELP consider adding an explicit lifetime bound
(d, p) //~ NOTE ...so that the type `T` will meet its required lifetime bounds
//~^ ERROR the parameter type `T` may not live long enough
}
diff --git a/tests/ui/suggestions/lifetimes/issue-105544.stderr b/tests/ui/suggestions/lifetimes/issue-105544.stderr
index 08fe21b11..553643c0c 100644
--- a/tests/ui/suggestions/lifetimes/issue-105544.stderr
+++ b/tests/ui/suggestions/lifetimes/issue-105544.stderr
@@ -1,108 +1,86 @@
error[E0311]: the parameter type `impl Sized` may not live long enough
--> $DIR/issue-105544.rs:7:5
|
-LL | (d, p)
- | ^^^^^^
- |
-note: the parameter type `impl Sized` must be valid for the anonymous lifetime defined here...
- --> $DIR/issue-105544.rs:5:26
- |
LL | fn foo(d: impl Sized, p: &mut ()) -> impl Sized + '_ {
- | ^^^^^^^
-note: ...so that the type `impl Sized` will meet its required lifetime bounds
- --> $DIR/issue-105544.rs:7:5
- |
+ | ------- the parameter type `impl Sized` must be valid for the anonymous lifetime defined here...
+LL |
LL | (d, p)
- | ^^^^^^
-help: consider adding an explicit lifetime bound...
+ | ^^^^^^ ...so that the type `impl Sized` will meet its required lifetime bounds
|
-LL | fn foo<'a>(d: impl Sized + 'a, p: &'a mut ()) -> impl Sized + '_ {
- | ++++ ++++ ++
+help: consider adding an explicit lifetime bound
+ |
+LL | fn foo<'a>(d: impl Sized + 'a, p: &'a mut ()) -> impl Sized + 'a {
+ | ++++ ++++ ++ ~~
error[E0309]: the parameter type `impl Sized` may not live long enough
- --> $DIR/issue-105544.rs:14:5
+ --> $DIR/issue-105544.rs:15:5
|
+LL | fn foo1<'b>(d: impl Sized, p: &'b mut ()) -> impl Sized + '_ {
+ | -- the parameter type `impl Sized` must be valid for the lifetime `'b` as defined here...
+...
LL | (d, p)
| ^^^^^^ ...so that the type `impl Sized` will meet its required lifetime bounds
|
-help: consider adding an explicit lifetime bound...
+help: consider adding an explicit lifetime bound
|
LL | fn foo1<'b>(d: impl Sized + 'b, p: &'b mut ()) -> impl Sized + '_ {
| ++++
error[E0311]: the parameter type `impl Sized + 'a` may not live long enough
- --> $DIR/issue-105544.rs:20:5
- |
-LL | (d, p)
- | ^^^^^^
- |
-note: the parameter type `impl Sized + 'a` must be valid for the anonymous lifetime defined here...
- --> $DIR/issue-105544.rs:18:36
+ --> $DIR/issue-105544.rs:21:5
|
LL | fn foo2<'a>(d: impl Sized + 'a, p: &mut ()) -> impl Sized + '_ {
- | ^^^^^^^
-note: ...so that the type `impl Sized + 'a` will meet its required lifetime bounds
- --> $DIR/issue-105544.rs:20:5
- |
+ | ------- the parameter type `impl Sized + 'a` must be valid for the anonymous lifetime defined here...
+LL |
LL | (d, p)
- | ^^^^^^
-help: consider adding an explicit lifetime bound...
+ | ^^^^^^ ...so that the type `impl Sized + 'a` will meet its required lifetime bounds
+ |
+help: consider adding an explicit lifetime bound
|
-LL | fn foo2<'b, 'a>(d: impl Sized + 'a + 'b, p: &'b mut ()) -> impl Sized + '_ {
- | +++ ++++ ++
+LL | fn foo2<'b, 'a>(d: impl Sized + 'a + 'b, p: &'b mut ()) -> impl Sized + 'b {
+ | +++ ++++ ++ ~~
error[E0311]: the parameter type `T` may not live long enough
- --> $DIR/issue-105544.rs:27:5
- |
-LL | (d, p)
- | ^^^^^^
- |
-note: the parameter type `T` must be valid for the anonymous lifetime defined here...
- --> $DIR/issue-105544.rs:25:28
+ --> $DIR/issue-105544.rs:28:5
|
LL | fn bar<T : Sized>(d: T, p: & mut ()) -> impl Sized + '_ {
- | ^^^^^^^^
-note: ...so that the type `T` will meet its required lifetime bounds
- --> $DIR/issue-105544.rs:27:5
- |
+ | -------- the parameter type `T` must be valid for the anonymous lifetime defined here...
+LL |
LL | (d, p)
- | ^^^^^^
-help: consider adding an explicit lifetime bound...
+ | ^^^^^^ ...so that the type `T` will meet its required lifetime bounds
+ |
+help: consider adding an explicit lifetime bound
|
-LL | fn bar<'a, T : Sized + 'a>(d: T, p: &'a mut ()) -> impl Sized + '_ {
- | +++ ++++ ++
+LL | fn bar<'a, T : Sized + 'a>(d: T, p: &'a mut ()) -> impl Sized + 'a {
+ | +++ ++++ ++ ~~
error[E0309]: the parameter type `T` may not live long enough
- --> $DIR/issue-105544.rs:34:5
+ --> $DIR/issue-105544.rs:36:5
|
+LL | fn bar1<'b, T : Sized>(d: T, p: &'b mut ()) -> impl Sized + '_ {
+ | -- the parameter type `T` must be valid for the lifetime `'b` as defined here...
+...
LL | (d, p)
| ^^^^^^ ...so that the type `T` will meet its required lifetime bounds
|
-help: consider adding an explicit lifetime bound...
+help: consider adding an explicit lifetime bound
|
LL | fn bar1<'b, T : Sized + 'b>(d: T, p: &'b mut ()) -> impl Sized + '_ {
| ++++
error[E0311]: the parameter type `T` may not live long enough
- --> $DIR/issue-105544.rs:40:5
- |
-LL | (d, p)
- | ^^^^^^
- |
-note: the parameter type `T` must be valid for the anonymous lifetime defined here...
- --> $DIR/issue-105544.rs:38:38
+ --> $DIR/issue-105544.rs:42:5
|
LL | fn bar2<'a, T : Sized + 'a>(d: T, p: &mut ()) -> impl Sized + '_ {
- | ^^^^^^^
-note: ...so that the type `T` will meet its required lifetime bounds
- --> $DIR/issue-105544.rs:40:5
- |
+ | ------- the parameter type `T` must be valid for the anonymous lifetime defined here...
+LL |
LL | (d, p)
- | ^^^^^^
-help: consider adding an explicit lifetime bound...
+ | ^^^^^^ ...so that the type `T` will meet its required lifetime bounds
+ |
+help: consider adding an explicit lifetime bound
|
-LL | fn bar2<'b, 'a, T : Sized + 'a + 'b>(d: T, p: &'b mut ()) -> impl Sized + '_ {
- | +++ ++++ ++
+LL | fn bar2<'b, 'a, T : Sized + 'a + 'b>(d: T, p: &'b mut ()) -> impl Sized + 'b {
+ | +++ ++++ ++ ~~
error: aborting due to 6 previous errors
diff --git a/tests/ui/suggestions/lifetimes/missing-lifetimes-in-signature-2.fixed b/tests/ui/suggestions/lifetimes/missing-lifetimes-in-signature-2.fixed
index 4013d98c3..474986283 100644
--- a/tests/ui/suggestions/lifetimes/missing-lifetimes-in-signature-2.fixed
+++ b/tests/ui/suggestions/lifetimes/missing-lifetimes-in-signature-2.fixed
@@ -19,11 +19,16 @@ trait Test {
fn test(&self);
}
-fn func<'a, T: Test + 'a>(foo: &'a Foo<'a>, t: T) {
+fn func<'a, T: Test + 'a>(_dummy: &Foo, foo: &Foo<'a>, t: T) {
foo.bar(move |_| {
//~^ ERROR the parameter type `T` may not live long enough
t.test();
});
}
+// Test that the suggested fix does not overconstrain `func`. See #115375.
+fn test_func<'a, T: Test + 'a>(dummy: &Foo, foo: &Foo<'a>, t: T) {
+ func(dummy, foo, t);
+}
+
fn main() {}
diff --git a/tests/ui/suggestions/lifetimes/missing-lifetimes-in-signature-2.rs b/tests/ui/suggestions/lifetimes/missing-lifetimes-in-signature-2.rs
index 4096d95e5..99c8e9626 100644
--- a/tests/ui/suggestions/lifetimes/missing-lifetimes-in-signature-2.rs
+++ b/tests/ui/suggestions/lifetimes/missing-lifetimes-in-signature-2.rs
@@ -19,11 +19,16 @@ trait Test {
fn test(&self);
}
-fn func<T: Test>(foo: &Foo, t: T) {
+fn func<T: Test>(_dummy: &Foo, foo: &Foo, t: T) {
foo.bar(move |_| {
//~^ ERROR the parameter type `T` may not live long enough
t.test();
});
}
+// Test that the suggested fix does not overconstrain `func`. See #115375.
+fn test_func<'a, T: Test + 'a>(dummy: &Foo, foo: &Foo<'a>, t: T) {
+ func(dummy, foo, t);
+}
+
fn main() {}
diff --git a/tests/ui/suggestions/lifetimes/missing-lifetimes-in-signature-2.stderr b/tests/ui/suggestions/lifetimes/missing-lifetimes-in-signature-2.stderr
index 936d87f79..6c63e1ada 100644
--- a/tests/ui/suggestions/lifetimes/missing-lifetimes-in-signature-2.stderr
+++ b/tests/ui/suggestions/lifetimes/missing-lifetimes-in-signature-2.stderr
@@ -1,29 +1,18 @@
error[E0311]: the parameter type `T` may not live long enough
--> $DIR/missing-lifetimes-in-signature-2.rs:23:5
|
+LL | fn func<T: Test>(_dummy: &Foo, foo: &Foo, t: T) {
+ | --- the parameter type `T` must be valid for the anonymous lifetime defined here...
LL | / foo.bar(move |_| {
LL | |
LL | | t.test();
LL | | });
- | |______^
+ | |______^ ...so that the type `T` will meet its required lifetime bounds
|
-note: the parameter type `T` must be valid for the anonymous lifetime defined here...
- --> $DIR/missing-lifetimes-in-signature-2.rs:22:24
+help: consider adding an explicit lifetime bound
|
-LL | fn func<T: Test>(foo: &Foo, t: T) {
- | ^^^
-note: ...so that the type `T` will meet its required lifetime bounds
- --> $DIR/missing-lifetimes-in-signature-2.rs:23:5
- |
-LL | / foo.bar(move |_| {
-LL | |
-LL | | t.test();
-LL | | });
- | |______^
-help: consider adding an explicit lifetime bound...
- |
-LL | fn func<'a, T: Test + 'a>(foo: &'a Foo<'a>, t: T) {
- | +++ ++++ ++ ++++
+LL | fn func<'a, T: Test + 'a>(_dummy: &Foo, foo: &Foo<'a>, t: T) {
+ | +++ ++++ ++++
error: aborting due to previous error
diff --git a/tests/ui/suggestions/lifetimes/missing-lifetimes-in-signature.stderr b/tests/ui/suggestions/lifetimes/missing-lifetimes-in-signature.stderr
index 318ea4083..64af17c83 100644
--- a/tests/ui/suggestions/lifetimes/missing-lifetimes-in-signature.stderr
+++ b/tests/ui/suggestions/lifetimes/missing-lifetimes-in-signature.stderr
@@ -28,28 +28,18 @@ LL | fn foo<G, T>(g: G, dest: &mut T) -> impl FnOnce() + '_
error[E0311]: the parameter type `G` may not live long enough
--> $DIR/missing-lifetimes-in-signature.rs:30:5
|
+LL | fn bar<G, T>(g: G, dest: &mut T) -> impl FnOnce() + '_
+ | ------ the parameter type `G` must be valid for the anonymous lifetime defined here...
+...
LL | / move || {
LL | |
LL | | *dest = g.get();
LL | | }
- | |_____^
- |
-note: the parameter type `G` must be valid for the anonymous lifetime defined here...
- --> $DIR/missing-lifetimes-in-signature.rs:26:26
- |
-LL | fn bar<G, T>(g: G, dest: &mut T) -> impl FnOnce() + '_
- | ^^^^^^
-note: ...so that the type `G` will meet its required lifetime bounds
- --> $DIR/missing-lifetimes-in-signature.rs:30:5
+ | |_____^ ...so that the type `G` will meet its required lifetime bounds
|
-LL | / move || {
-LL | |
-LL | | *dest = g.get();
-LL | | }
- | |_____^
-help: consider adding an explicit lifetime bound...
+help: consider adding an explicit lifetime bound
|
-LL ~ fn bar<'a, G, T>(g: G, dest: &'a mut T) -> impl FnOnce() + '_
+LL ~ fn bar<'a, G, T>(g: G, dest: &'a mut T) -> impl FnOnce() + 'a
LL | where
LL ~ G: Get<T> + 'a,
|
@@ -57,85 +47,53 @@ LL ~ G: Get<T> + 'a,
error[E0311]: the parameter type `G` may not live long enough
--> $DIR/missing-lifetimes-in-signature.rs:52:5
|
+LL | fn qux<'a, G: 'a, T>(g: G, dest: &mut T) -> impl FnOnce() + '_
+ | ------ the parameter type `G` must be valid for the anonymous lifetime defined here...
+...
LL | / move || {
LL | |
LL | | *dest = g.get();
LL | | }
- | |_____^
- |
-note: the parameter type `G` must be valid for the anonymous lifetime defined here...
- --> $DIR/missing-lifetimes-in-signature.rs:48:34
- |
-LL | fn qux<'a, G: 'a, T>(g: G, dest: &mut T) -> impl FnOnce() + '_
- | ^^^^^^
-note: ...so that the type `G` will meet its required lifetime bounds
- --> $DIR/missing-lifetimes-in-signature.rs:52:5
+ | |_____^ ...so that the type `G` will meet its required lifetime bounds
|
-LL | / move || {
-LL | |
-LL | | *dest = g.get();
-LL | | }
- | |_____^
-help: consider adding an explicit lifetime bound...
+help: consider adding an explicit lifetime bound
|
-LL | fn qux<'b, 'a, G: 'a + 'b, T>(g: G, dest: &'b mut T) -> impl FnOnce() + '_
- | +++ ++++ ++
+LL | fn qux<'b, 'a, G: 'a + 'b, T>(g: G, dest: &'b mut T) -> impl FnOnce() + 'b
+ | +++ ++++ ++ ~~
error[E0311]: the parameter type `G` may not live long enough
--> $DIR/missing-lifetimes-in-signature.rs:61:9
|
+LL | fn qux<'b, G: Get<T> + 'b, T>(g: G, dest: &mut T) -> impl FnOnce() + '_ {
+ | ------ the parameter type `G` must be valid for the anonymous lifetime defined here...
LL | / move || {
LL | |
LL | | *dest = g.get();
LL | | }
- | |_________^
+ | |_________^ ...so that the type `G` will meet its required lifetime bounds
|
-note: the parameter type `G` must be valid for the anonymous lifetime defined here...
- --> $DIR/missing-lifetimes-in-signature.rs:60:47
+help: consider adding an explicit lifetime bound
|
-LL | fn qux<'b, G: Get<T> + 'b, T>(g: G, dest: &mut T) -> impl FnOnce() + '_ {
- | ^^^^^^
-note: ...so that the type `G` will meet its required lifetime bounds
- --> $DIR/missing-lifetimes-in-signature.rs:61:9
- |
-LL | / move || {
-LL | |
-LL | | *dest = g.get();
-LL | | }
- | |_________^
-help: consider adding an explicit lifetime bound...
- |
-LL | fn qux<'c, 'b, G: Get<T> + 'b + 'c, T>(g: G, dest: &'c mut T) -> impl FnOnce() + '_ {
- | +++ ++++ ++
+LL | fn qux<'c, 'b, G: Get<T> + 'b + 'c, T>(g: G, dest: &'c mut T) -> impl FnOnce() + 'c {
+ | +++ ++++ ++ ~~
error[E0311]: the parameter type `G` may not live long enough
--> $DIR/missing-lifetimes-in-signature.rs:73:5
|
+LL | fn bat<'a, G: 'a, T>(g: G, dest: &mut T) -> impl FnOnce() + '_ + 'a
+ | ------ the parameter type `G` must be valid for the anonymous lifetime defined here...
+...
LL | / move || {
LL | |
LL | |
LL | | *dest = g.get();
LL | | }
- | |_____^
- |
-note: the parameter type `G` must be valid for the anonymous lifetime defined here...
- --> $DIR/missing-lifetimes-in-signature.rs:69:34
- |
-LL | fn bat<'a, G: 'a, T>(g: G, dest: &mut T) -> impl FnOnce() + '_ + 'a
- | ^^^^^^
-note: ...so that the type `G` will meet its required lifetime bounds
- --> $DIR/missing-lifetimes-in-signature.rs:73:5
+ | |_____^ ...so that the type `G` will meet its required lifetime bounds
|
-LL | / move || {
-LL | |
-LL | |
-LL | | *dest = g.get();
-LL | | }
- | |_____^
-help: consider adding an explicit lifetime bound...
+help: consider adding an explicit lifetime bound
|
-LL | fn bat<'b, 'a, G: 'a + 'b, T>(g: G, dest: &'b mut T) -> impl FnOnce() + '_ + 'a
- | +++ ++++ ++
+LL | fn bat<'b, 'a, G: 'a + 'b, T>(g: G, dest: &'b mut T) -> impl FnOnce() + 'b + 'a
+ | +++ ++++ ++ ~~
error[E0621]: explicit lifetime required in the type of `dest`
--> $DIR/missing-lifetimes-in-signature.rs:73:5
@@ -153,13 +111,16 @@ LL | | }
error[E0309]: the parameter type `G` may not live long enough
--> $DIR/missing-lifetimes-in-signature.rs:85:5
|
+LL | fn bak<'a, G, T>(g: G, dest: &'a mut T) -> impl FnOnce() + 'a
+ | -- the parameter type `G` must be valid for the lifetime `'a` as defined here...
+...
LL | / move || {
LL | |
LL | | *dest = g.get();
LL | | }
| |_____^ ...so that the type `G` will meet its required lifetime bounds
|
-help: consider adding an explicit lifetime bound...
+help: consider adding an explicit lifetime bound
|
LL | G: Get<T> + 'a,
| ++++
diff --git a/tests/ui/suggestions/lifetimes/type-param-bound-scope.fixed b/tests/ui/suggestions/lifetimes/type-param-bound-scope.fixed
new file mode 100644
index 000000000..470cc67b9
--- /dev/null
+++ b/tests/ui/suggestions/lifetimes/type-param-bound-scope.fixed
@@ -0,0 +1,47 @@
+// Make sure we suggest the bound `T: 'a` in the correct scope:
+// trait, impl or associated fn.
+// run-rustfix
+
+struct Inv<'a>(Option<*mut &'a u8>);
+
+fn check_bound<'a, A: 'a>(_: A, _: Inv<'a>) {}
+
+trait Trait1<'a>: Sized where Self: 'a {
+ fn foo(self, lt: Inv<'a>) {
+ check_bound(self, lt)
+ //~^ ERROR parameter type `Self` may not live long enough
+ }
+}
+
+trait Trait2: Sized {
+ fn foo<'a>(self, lt: Inv<'a>) where Self: 'a {
+ check_bound(self, lt)
+ //~^ ERROR parameter type `Self` may not live long enough
+ }
+}
+
+trait Trait3<T> {
+ fn foo<'a>(arg: T, lt: Inv<'a>) where T: 'a {
+ check_bound(arg, lt)
+ //~^ ERROR parameter type `T` may not live long enough
+ }
+}
+
+trait Trait4<'a> {
+ fn foo<T: 'a>(arg: T, lt: Inv<'a>) {
+ check_bound(arg, lt)
+ //~^ ERROR parameter type `T` may not live long enough
+ }
+}
+
+trait Trait5<'a> {
+ fn foo(self, _: Inv<'a>);
+}
+impl<'a, T: 'a> Trait5<'a> for T {
+ fn foo(self, lt: Inv<'a>) {
+ check_bound(self, lt);
+ //~^ ERROR parameter type `T` may not live long enough
+ }
+}
+
+fn main() {}
diff --git a/tests/ui/suggestions/lifetimes/type-param-bound-scope.rs b/tests/ui/suggestions/lifetimes/type-param-bound-scope.rs
new file mode 100644
index 000000000..874788e13
--- /dev/null
+++ b/tests/ui/suggestions/lifetimes/type-param-bound-scope.rs
@@ -0,0 +1,47 @@
+// Make sure we suggest the bound `T: 'a` in the correct scope:
+// trait, impl or associated fn.
+// run-rustfix
+
+struct Inv<'a>(Option<*mut &'a u8>);
+
+fn check_bound<'a, A: 'a>(_: A, _: Inv<'a>) {}
+
+trait Trait1<'a>: Sized {
+ fn foo(self, lt: Inv<'a>) {
+ check_bound(self, lt)
+ //~^ ERROR parameter type `Self` may not live long enough
+ }
+}
+
+trait Trait2: Sized {
+ fn foo<'a>(self, lt: Inv<'a>) {
+ check_bound(self, lt)
+ //~^ ERROR parameter type `Self` may not live long enough
+ }
+}
+
+trait Trait3<T> {
+ fn foo<'a>(arg: T, lt: Inv<'a>) {
+ check_bound(arg, lt)
+ //~^ ERROR parameter type `T` may not live long enough
+ }
+}
+
+trait Trait4<'a> {
+ fn foo<T>(arg: T, lt: Inv<'a>) {
+ check_bound(arg, lt)
+ //~^ ERROR parameter type `T` may not live long enough
+ }
+}
+
+trait Trait5<'a> {
+ fn foo(self, _: Inv<'a>);
+}
+impl<'a, T> Trait5<'a> for T {
+ fn foo(self, lt: Inv<'a>) {
+ check_bound(self, lt);
+ //~^ ERROR parameter type `T` may not live long enough
+ }
+}
+
+fn main() {}
diff --git a/tests/ui/suggestions/lifetimes/type-param-bound-scope.stderr b/tests/ui/suggestions/lifetimes/type-param-bound-scope.stderr
new file mode 100644
index 000000000..d3ca2cc11
--- /dev/null
+++ b/tests/ui/suggestions/lifetimes/type-param-bound-scope.stderr
@@ -0,0 +1,71 @@
+error[E0309]: the parameter type `Self` may not live long enough
+ --> $DIR/type-param-bound-scope.rs:11:9
+ |
+LL | trait Trait1<'a>: Sized {
+ | -- the parameter type `Self` must be valid for the lifetime `'a` as defined here...
+LL | fn foo(self, lt: Inv<'a>) {
+LL | check_bound(self, lt)
+ | ^^^^^^^^^^^^^^^^^^^^^ ...so that the type `Self` will meet its required lifetime bounds
+ |
+help: consider adding an explicit lifetime bound
+ |
+LL | trait Trait1<'a>: Sized where Self: 'a {
+ | ++++++++++++++
+
+error[E0309]: the parameter type `Self` may not live long enough
+ --> $DIR/type-param-bound-scope.rs:18:9
+ |
+LL | fn foo<'a>(self, lt: Inv<'a>) {
+ | -- the parameter type `Self` must be valid for the lifetime `'a` as defined here...
+LL | check_bound(self, lt)
+ | ^^^^^^^^^^^^^^^^^^^^^ ...so that the type `Self` will meet its required lifetime bounds
+ |
+help: consider adding an explicit lifetime bound
+ |
+LL | fn foo<'a>(self, lt: Inv<'a>) where Self: 'a {
+ | ++++++++++++++
+
+error[E0309]: the parameter type `T` may not live long enough
+ --> $DIR/type-param-bound-scope.rs:25:9
+ |
+LL | fn foo<'a>(arg: T, lt: Inv<'a>) {
+ | -- the parameter type `T` must be valid for the lifetime `'a` as defined here...
+LL | check_bound(arg, lt)
+ | ^^^^^^^^^^^^^^^^^^^^ ...so that the type `T` will meet its required lifetime bounds
+ |
+help: consider adding an explicit lifetime bound
+ |
+LL | fn foo<'a>(arg: T, lt: Inv<'a>) where T: 'a {
+ | +++++++++++
+
+error[E0309]: the parameter type `T` may not live long enough
+ --> $DIR/type-param-bound-scope.rs:32:9
+ |
+LL | trait Trait4<'a> {
+ | -- the parameter type `T` must be valid for the lifetime `'a` as defined here...
+LL | fn foo<T>(arg: T, lt: Inv<'a>) {
+LL | check_bound(arg, lt)
+ | ^^^^^^^^^^^^^^^^^^^^ ...so that the type `T` will meet its required lifetime bounds
+ |
+help: consider adding an explicit lifetime bound
+ |
+LL | fn foo<T: 'a>(arg: T, lt: Inv<'a>) {
+ | ++++
+
+error[E0309]: the parameter type `T` may not live long enough
+ --> $DIR/type-param-bound-scope.rs:42:9
+ |
+LL | impl<'a, T> Trait5<'a> for T {
+ | -- the parameter type `T` must be valid for the lifetime `'a` as defined here...
+LL | fn foo(self, lt: Inv<'a>) {
+LL | check_bound(self, lt);
+ | ^^^^^^^^^^^^^^^^^^^^^ ...so that the type `T` will meet its required lifetime bounds
+ |
+help: consider adding an explicit lifetime bound
+ |
+LL | impl<'a, T: 'a> Trait5<'a> for T {
+ | ++++
+
+error: aborting due to 5 previous errors
+
+For more information about this error, try `rustc --explain E0309`.
diff --git a/tests/ui/suggestions/lifetimes/type-param-missing-lifetime.fixed b/tests/ui/suggestions/lifetimes/type-param-missing-lifetime.fixed
new file mode 100644
index 000000000..e30c55645
--- /dev/null
+++ b/tests/ui/suggestions/lifetimes/type-param-missing-lifetime.fixed
@@ -0,0 +1,52 @@
+// We want to suggest a bound `T: 'a` but `'a` is elided,
+// run-rustfix
+// edition: 2018
+#![allow(dead_code)]
+
+struct Inv<'a>(Option<*mut &'a u8>);
+
+fn check_bound<'a, A: 'a>(_: A, _: Inv<'a>) {}
+
+struct Elided<'a, T = ()>(Inv<'a>, T);
+
+struct MyTy<X>(X);
+
+impl<'a, X> MyTy<Elided<'a, X>> {
+ async fn foo<A: 'a>(self, arg: A, _: &str) -> &str {
+ check_bound(arg, self.0 .0);
+ //~^ ERROR parameter type `A` may not live long enough
+ ""
+ }
+}
+
+// Make sure the new lifetime name doesn't conflict with
+// other early- or late-bound lifetimes in-scope.
+impl<'a, A> MyTy<(A, &'a ())> {
+ async fn foo2<'b>(
+ arg: A,
+ lt: Inv<'b>,
+ ) -> (
+ impl Into<&'b str> + Into<&'b str> + 'b,
+ impl Into<Option<Elided<'b>>> + 'b,
+ impl Into<Option<Elided<'b, ()>>>,
+ ) where A: 'b {
+ check_bound(arg, lt);
+ //~^ ERROR parameter type `A` may not live long enough
+ ("", None, None)
+ }
+
+ // same as above but there is a late-bound lifetime named `'b`.
+ async fn bar2<'c, 'b>(_dummy: &'a u8, arg: A, lt: Inv<'c>) where A: 'c {
+ check_bound(arg, lt);
+ //~^ ERROR parameter type `A` may not live long enough
+ }
+}
+
+impl<'a, A: 'a> MyTy<Elided<'a, A>> {
+ async fn foo3(self) {
+ check_bound(self.0 .1, self.0 .0);
+ //~^ ERROR parameter type `A` may not live long enough
+ }
+}
+
+fn main() {}
diff --git a/tests/ui/suggestions/lifetimes/type-param-missing-lifetime.rs b/tests/ui/suggestions/lifetimes/type-param-missing-lifetime.rs
new file mode 100644
index 000000000..85f08808b
--- /dev/null
+++ b/tests/ui/suggestions/lifetimes/type-param-missing-lifetime.rs
@@ -0,0 +1,52 @@
+// We want to suggest a bound `T: 'a` but `'a` is elided,
+// run-rustfix
+// edition: 2018
+#![allow(dead_code)]
+
+struct Inv<'a>(Option<*mut &'a u8>);
+
+fn check_bound<'a, A: 'a>(_: A, _: Inv<'a>) {}
+
+struct Elided<'a, T = ()>(Inv<'a>, T);
+
+struct MyTy<X>(X);
+
+impl<X> MyTy<Elided<'_, X>> {
+ async fn foo<A>(self, arg: A, _: &str) -> &str {
+ check_bound(arg, self.0 .0);
+ //~^ ERROR parameter type `A` may not live long enough
+ ""
+ }
+}
+
+// Make sure the new lifetime name doesn't conflict with
+// other early- or late-bound lifetimes in-scope.
+impl<'a, A> MyTy<(A, &'a ())> {
+ async fn foo2(
+ arg: A,
+ lt: Inv<'_>,
+ ) -> (
+ impl Into<&str> + Into<&'_ str> + '_,
+ impl Into<Option<Elided>> + '_,
+ impl Into<Option<Elided<()>>>,
+ ) {
+ check_bound(arg, lt);
+ //~^ ERROR parameter type `A` may not live long enough
+ ("", None, None)
+ }
+
+ // same as above but there is a late-bound lifetime named `'b`.
+ async fn bar2<'b>(_dummy: &'a u8, arg: A, lt: Inv<'_>) {
+ check_bound(arg, lt);
+ //~^ ERROR parameter type `A` may not live long enough
+ }
+}
+
+impl<A> MyTy<Elided<'_, A>> {
+ async fn foo3(self) {
+ check_bound(self.0 .1, self.0 .0);
+ //~^ ERROR parameter type `A` may not live long enough
+ }
+}
+
+fn main() {}
diff --git a/tests/ui/suggestions/lifetimes/type-param-missing-lifetime.stderr b/tests/ui/suggestions/lifetimes/type-param-missing-lifetime.stderr
new file mode 100644
index 000000000..2f74a006b
--- /dev/null
+++ b/tests/ui/suggestions/lifetimes/type-param-missing-lifetime.stderr
@@ -0,0 +1,66 @@
+error[E0311]: the parameter type `A` may not live long enough
+ --> $DIR/type-param-missing-lifetime.rs:16:9
+ |
+LL | impl<X> MyTy<Elided<'_, X>> {
+ | -- the parameter type `A` must be valid for the anonymous lifetime as defined here...
+LL | async fn foo<A>(self, arg: A, _: &str) -> &str {
+LL | check_bound(arg, self.0 .0);
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...so that the type `A` will meet its required lifetime bounds
+ |
+help: consider adding an explicit lifetime bound
+ |
+LL ~ impl<'a, X> MyTy<Elided<'a, X>> {
+LL ~ async fn foo<A: 'a>(self, arg: A, _: &str) -> &str {
+ |
+
+error[E0311]: the parameter type `A` may not live long enough
+ --> $DIR/type-param-missing-lifetime.rs:33:9
+ |
+LL | lt: Inv<'_>,
+ | ------- the parameter type `A` must be valid for the anonymous lifetime defined here...
+...
+LL | check_bound(arg, lt);
+ | ^^^^^^^^^^^^^^^^^^^^ ...so that the type `A` will meet its required lifetime bounds
+ |
+help: consider adding an explicit lifetime bound
+ |
+LL ~ async fn foo2<'b>(
+LL | arg: A,
+LL ~ lt: Inv<'b>,
+LL | ) -> (
+LL ~ impl Into<&'b str> + Into<&'b str> + 'b,
+LL ~ impl Into<Option<Elided<'b>>> + 'b,
+LL ~ impl Into<Option<Elided<'b, ()>>>,
+LL ~ ) where A: 'b {
+ |
+
+error[E0311]: the parameter type `A` may not live long enough
+ --> $DIR/type-param-missing-lifetime.rs:40:9
+ |
+LL | async fn bar2<'b>(_dummy: &'a u8, arg: A, lt: Inv<'_>) {
+ | ------- the parameter type `A` must be valid for the anonymous lifetime defined here...
+LL | check_bound(arg, lt);
+ | ^^^^^^^^^^^^^^^^^^^^ ...so that the type `A` will meet its required lifetime bounds
+ |
+help: consider adding an explicit lifetime bound
+ |
+LL | async fn bar2<'c, 'b>(_dummy: &'a u8, arg: A, lt: Inv<'c>) where A: 'c {
+ | +++ ~~ +++++++++++
+
+error[E0311]: the parameter type `A` may not live long enough
+ --> $DIR/type-param-missing-lifetime.rs:47:9
+ |
+LL | impl<A> MyTy<Elided<'_, A>> {
+ | -- the parameter type `A` must be valid for the anonymous lifetime as defined here...
+LL | async fn foo3(self) {
+LL | check_bound(self.0 .1, self.0 .0);
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...so that the type `A` will meet its required lifetime bounds
+ |
+help: consider adding an explicit lifetime bound
+ |
+LL | impl<'a, A: 'a> MyTy<Elided<'a, A>> {
+ | +++ ++++ ~~
+
+error: aborting due to 4 previous errors
+
+For more information about this error, try `rustc --explain E0311`.