summaryrefslogtreecommitdiffstats
path: root/src/test/ui/suggestions/lifetimes/missing-lifetimes-in-signature.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/ui/suggestions/lifetimes/missing-lifetimes-in-signature.rs')
-rw-r--r--src/test/ui/suggestions/lifetimes/missing-lifetimes-in-signature.rs111
1 files changed, 111 insertions, 0 deletions
diff --git a/src/test/ui/suggestions/lifetimes/missing-lifetimes-in-signature.rs b/src/test/ui/suggestions/lifetimes/missing-lifetimes-in-signature.rs
new file mode 100644
index 000000000..b641f5941
--- /dev/null
+++ b/src/test/ui/suggestions/lifetimes/missing-lifetimes-in-signature.rs
@@ -0,0 +1,111 @@
+pub trait Get<T> {
+ fn get(self) -> T;
+}
+
+struct Foo {
+ x: usize,
+}
+
+impl Get<usize> for Foo {
+ fn get(self) -> usize {
+ self.x
+ }
+}
+
+fn foo<G, T>(g: G, dest: &mut T) -> impl FnOnce()
+where
+ G: Get<T>,
+{
+ move || {
+ //~^ ERROR hidden type for `impl FnOnce()` captures lifetime
+ *dest = g.get();
+ }
+}
+
+// After applying suggestion for `foo`:
+fn bar<G, T>(g: G, dest: &mut T) -> impl FnOnce() + '_
+where
+ G: Get<T>,
+{
+ move || {
+ //~^ ERROR the parameter type `G` may not live long enough
+ *dest = g.get();
+ }
+}
+
+// After applying suggestion for `bar`:
+fn baz<G: 'a, T>(g: G, dest: &mut T) -> impl FnOnce() + '_
+//~^ ERROR undeclared lifetime name `'a`
+where
+ G: Get<T>,
+{
+ move || {
+ *dest = g.get();
+ }
+}
+
+// After applying suggestion for `baz`:
+fn qux<'a, G: 'a, T>(g: G, dest: &mut T) -> impl FnOnce() + '_
+where
+ G: Get<T>,
+{
+ move || {
+ //~^ ERROR the parameter type `G` may not live long enough
+ *dest = g.get();
+ }
+}
+
+// Same as above, but show that we pay attention to lifetime names from parent item
+impl<'a> Foo {
+ fn qux<'b, G: Get<T> + 'b, T>(g: G, dest: &mut T) -> impl FnOnce() + '_ {
+ move || {
+ //~^ ERROR the parameter type `G` may not live long enough
+ *dest = g.get();
+ }
+ }
+}
+
+// After applying suggestion for `qux`:
+fn bat<'a, G: 'a, T>(g: G, dest: &mut T) -> impl FnOnce() + '_ + 'a
+where
+ G: Get<T>,
+{
+ move || {
+ //~^ ERROR the parameter type `G` may not live long enough
+ //~| ERROR explicit lifetime required
+ *dest = g.get();
+ }
+}
+
+// Potential incorrect attempt:
+fn bak<'a, G, T>(g: G, dest: &'a mut T) -> impl FnOnce() + 'a
+where
+ G: Get<T>,
+{
+ move || {
+ //~^ ERROR the parameter type `G` may not live long enough
+ *dest = g.get();
+ }
+}
+
+// We need to tie the lifetime of `G` with the lifetime of `&mut T` and the returned closure:
+fn ok<'a, G: 'a, T>(g: G, dest: &'a mut T) -> impl FnOnce() + 'a
+where
+ G: Get<T>,
+{
+ move || {
+ *dest = g.get();
+ }
+}
+
+// This also works. The `'_` isn't necessary but it's where we arrive to following the suggestions:
+fn ok2<'a, G: 'a, T>(g: G, dest: &'a mut T) -> impl FnOnce() + '_ + 'a
+where
+ G: Get<T>,
+{
+ move || {
+ *dest = g.get();
+ }
+}
+
+fn main() {}