summaryrefslogtreecommitdiffstats
path: root/src/test/ui/closures/binder
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/ui/closures/binder')
-rw-r--r--src/test/ui/closures/binder/async-closure-with-binder.rs8
-rw-r--r--src/test/ui/closures/binder/async-closure-with-binder.stderr16
-rw-r--r--src/test/ui/closures/binder/implicit-return.rs6
-rw-r--r--src/test/ui/closures/binder/implicit-return.stderr10
-rw-r--r--src/test/ui/closures/binder/implicit-stuff.rs27
-rw-r--r--src/test/ui/closures/binder/implicit-stuff.stderr107
-rw-r--r--src/test/ui/closures/binder/suggestion-for-introducing-lifetime-into-binder.rs7
-rw-r--r--src/test/ui/closures/binder/suggestion-for-introducing-lifetime-into-binder.stderr33
8 files changed, 214 insertions, 0 deletions
diff --git a/src/test/ui/closures/binder/async-closure-with-binder.rs b/src/test/ui/closures/binder/async-closure-with-binder.rs
new file mode 100644
index 000000000..4fa599d37
--- /dev/null
+++ b/src/test/ui/closures/binder/async-closure-with-binder.rs
@@ -0,0 +1,8 @@
+// edition:2021
+#![feature(closure_lifetime_binder)]
+#![feature(async_closure)]
+fn main() {
+ for<'a> async || ();
+ //~^ ERROR `for<...>` binders on `async` closures are not currently supported
+ //~^^ ERROR implicit types in closure signatures are forbidden when `for<...>` is present
+}
diff --git a/src/test/ui/closures/binder/async-closure-with-binder.stderr b/src/test/ui/closures/binder/async-closure-with-binder.stderr
new file mode 100644
index 000000000..1d4628b1a
--- /dev/null
+++ b/src/test/ui/closures/binder/async-closure-with-binder.stderr
@@ -0,0 +1,16 @@
+error: `for<...>` binders on `async` closures are not currently supported
+ --> $DIR/async-closure-with-binder.rs:5:5
+ |
+LL | for<'a> async || ();
+ | ^^^^^^^
+
+error: implicit types in closure signatures are forbidden when `for<...>` is present
+ --> $DIR/async-closure-with-binder.rs:5:5
+ |
+LL | for<'a> async || ();
+ | -------^^^^^^^^^
+ | |
+ | `for<...>` is here
+
+error: aborting due to 2 previous errors
+
diff --git a/src/test/ui/closures/binder/implicit-return.rs b/src/test/ui/closures/binder/implicit-return.rs
new file mode 100644
index 000000000..d34e5721d
--- /dev/null
+++ b/src/test/ui/closures/binder/implicit-return.rs
@@ -0,0 +1,6 @@
+#![feature(closure_lifetime_binder)]
+
+fn main() {
+ let _f = for<'a> |_: &'a ()| {};
+ //~^ implicit types in closure signatures are forbidden when `for<...>` is present
+}
diff --git a/src/test/ui/closures/binder/implicit-return.stderr b/src/test/ui/closures/binder/implicit-return.stderr
new file mode 100644
index 000000000..5bfb97113
--- /dev/null
+++ b/src/test/ui/closures/binder/implicit-return.stderr
@@ -0,0 +1,10 @@
+error: implicit types in closure signatures are forbidden when `for<...>` is present
+ --> $DIR/implicit-return.rs:4:34
+ |
+LL | let _f = for<'a> |_: &'a ()| {};
+ | ------- ^
+ | |
+ | `for<...>` is here
+
+error: aborting due to previous error
+
diff --git a/src/test/ui/closures/binder/implicit-stuff.rs b/src/test/ui/closures/binder/implicit-stuff.rs
new file mode 100644
index 000000000..09e4c747a
--- /dev/null
+++ b/src/test/ui/closures/binder/implicit-stuff.rs
@@ -0,0 +1,27 @@
+#![feature(closure_lifetime_binder)]
+
+fn main() {
+ // Implicit types
+ let _ = for<> || {}; //~ ERROR implicit types in closure signatures are forbidden when `for<...>` is present
+ let _ = for<'a> || -> &'a _ { &() }; //~ ERROR implicit types in closure signatures are forbidden when `for<...>` is present
+ let _ = for<'a> |x| -> &'a () { x }; //~ ERROR implicit types in closure signatures are forbidden when `for<...>` is present
+ let _ = for<'a> |x: &'a _| -> &'a () { x }; //~ ERROR implicit types in closure signatures are forbidden when `for<...>` is present
+ let _ = for<'a> |x: &'a Vec::<_>| -> &'a Vec::<()> { x }; //~ ERROR implicit types in closure signatures are forbidden when `for<...>` is present
+ let _ = for<'a> |x: &'a Vec<()>| -> &'a Vec<_> { x }; //~ ERROR implicit types in closure signatures are forbidden when `for<...>` is present
+ let _ = for<'a> |x: &'a _| -> &'a &'a () { x }; //~ ERROR implicit types in closure signatures are forbidden when `for<...>` is present
+ let _ = for<'a> |x: &'a _, y, z: _| -> &'a _ { //~ ERROR implicit types in closure signatures are forbidden when `for<...>` is present
+ let _: &u8 = x;
+ let _: u32 = y;
+ let _: i32 = z;
+ x
+ };
+
+ // Lifetime elision
+ let _ = for<> |_: &()| -> () {}; //~ ERROR `&` without an explicit lifetime name cannot be used here
+ let _ = for<> |x: &()| -> &() { x }; //~ ERROR `&` without an explicit lifetime name cannot be used here
+ //~| ERROR `&` without an explicit lifetime name cannot be used here
+ let _ = for<> |x: &'_ ()| -> &'_ () { x }; //~ ERROR `'_` cannot be used here
+ //~| ERROR `'_` cannot be used here
+ let _ = for<'a> |x: &()| -> &'a () { x }; //~ ERROR `&` without an explicit lifetime name cannot be used here
+ let _ = for<'a> |x: &'a ()| -> &() { x }; //~ ERROR `&` without an explicit lifetime name cannot be used here
+}
diff --git a/src/test/ui/closures/binder/implicit-stuff.stderr b/src/test/ui/closures/binder/implicit-stuff.stderr
new file mode 100644
index 000000000..779a08a44
--- /dev/null
+++ b/src/test/ui/closures/binder/implicit-stuff.stderr
@@ -0,0 +1,107 @@
+error[E0637]: `&` without an explicit lifetime name cannot be used here
+ --> $DIR/implicit-stuff.rs:20:23
+ |
+LL | let _ = for<> |_: &()| -> () {};
+ | ^ explicit lifetime name needed here
+
+error[E0637]: `&` without an explicit lifetime name cannot be used here
+ --> $DIR/implicit-stuff.rs:21:23
+ |
+LL | let _ = for<> |x: &()| -> &() { x };
+ | ^ explicit lifetime name needed here
+
+error[E0637]: `&` without an explicit lifetime name cannot be used here
+ --> $DIR/implicit-stuff.rs:21:31
+ |
+LL | let _ = for<> |x: &()| -> &() { x };
+ | ^ explicit lifetime name needed here
+
+error[E0637]: `'_` cannot be used here
+ --> $DIR/implicit-stuff.rs:23:24
+ |
+LL | let _ = for<> |x: &'_ ()| -> &'_ () { x };
+ | ^^ `'_` is a reserved lifetime name
+
+error[E0637]: `'_` cannot be used here
+ --> $DIR/implicit-stuff.rs:23:35
+ |
+LL | let _ = for<> |x: &'_ ()| -> &'_ () { x };
+ | ^^ `'_` is a reserved lifetime name
+
+error[E0637]: `&` without an explicit lifetime name cannot be used here
+ --> $DIR/implicit-stuff.rs:25:25
+ |
+LL | let _ = for<'a> |x: &()| -> &'a () { x };
+ | ^ explicit lifetime name needed here
+
+error[E0637]: `&` without an explicit lifetime name cannot be used here
+ --> $DIR/implicit-stuff.rs:26:36
+ |
+LL | let _ = for<'a> |x: &'a ()| -> &() { x };
+ | ^ explicit lifetime name needed here
+
+error: implicit types in closure signatures are forbidden when `for<...>` is present
+ --> $DIR/implicit-stuff.rs:5:22
+ |
+LL | let _ = for<> || {};
+ | ----- ^
+ | |
+ | `for<...>` is here
+
+error: implicit types in closure signatures are forbidden when `for<...>` is present
+ --> $DIR/implicit-stuff.rs:6:31
+ |
+LL | let _ = for<'a> || -> &'a _ { &() };
+ | ------- ^
+ | |
+ | `for<...>` is here
+
+error: implicit types in closure signatures are forbidden when `for<...>` is present
+ --> $DIR/implicit-stuff.rs:7:22
+ |
+LL | let _ = for<'a> |x| -> &'a () { x };
+ | ------- ^
+ | |
+ | `for<...>` is here
+
+error: implicit types in closure signatures are forbidden when `for<...>` is present
+ --> $DIR/implicit-stuff.rs:8:29
+ |
+LL | let _ = for<'a> |x: &'a _| -> &'a () { x };
+ | ------- ^
+ | |
+ | `for<...>` is here
+
+error: implicit types in closure signatures are forbidden when `for<...>` is present
+ --> $DIR/implicit-stuff.rs:9:35
+ |
+LL | let _ = for<'a> |x: &'a Vec::<_>| -> &'a Vec::<()> { x };
+ | ------- ^
+ | |
+ | `for<...>` is here
+
+error: implicit types in closure signatures are forbidden when `for<...>` is present
+ --> $DIR/implicit-stuff.rs:10:49
+ |
+LL | let _ = for<'a> |x: &'a Vec<()>| -> &'a Vec<_> { x };
+ | ------- `for<...>` is here ^
+
+error: implicit types in closure signatures are forbidden when `for<...>` is present
+ --> $DIR/implicit-stuff.rs:11:29
+ |
+LL | let _ = for<'a> |x: &'a _| -> &'a &'a () { x };
+ | ------- ^
+ | |
+ | `for<...>` is here
+
+error: implicit types in closure signatures are forbidden when `for<...>` is present
+ --> $DIR/implicit-stuff.rs:12:29
+ |
+LL | let _ = for<'a> |x: &'a _, y, z: _| -> &'a _ {
+ | ------- ^ ^ ^ ^
+ | |
+ | `for<...>` is here
+
+error: aborting due to 15 previous errors
+
+For more information about this error, try `rustc --explain E0637`.
diff --git a/src/test/ui/closures/binder/suggestion-for-introducing-lifetime-into-binder.rs b/src/test/ui/closures/binder/suggestion-for-introducing-lifetime-into-binder.rs
new file mode 100644
index 000000000..b476dd50c
--- /dev/null
+++ b/src/test/ui/closures/binder/suggestion-for-introducing-lifetime-into-binder.rs
@@ -0,0 +1,7 @@
+#![feature(closure_lifetime_binder)]
+fn main() {
+ for<> |_: &'a ()| -> () {};
+ //~^ ERROR use of undeclared lifetime name `'a`
+ for<'a> |_: &'b ()| -> () {};
+ //~^ ERROR use of undeclared lifetime name `'b`
+}
diff --git a/src/test/ui/closures/binder/suggestion-for-introducing-lifetime-into-binder.stderr b/src/test/ui/closures/binder/suggestion-for-introducing-lifetime-into-binder.stderr
new file mode 100644
index 000000000..1381acc15
--- /dev/null
+++ b/src/test/ui/closures/binder/suggestion-for-introducing-lifetime-into-binder.stderr
@@ -0,0 +1,33 @@
+error[E0261]: use of undeclared lifetime name `'a`
+ --> $DIR/suggestion-for-introducing-lifetime-into-binder.rs:3:16
+ |
+LL | for<> |_: &'a ()| -> () {};
+ | ^^ undeclared lifetime
+ |
+help: consider introducing lifetime `'a` here
+ |
+LL | for<'a, > |_: &'a ()| -> () {};
+ | +++
+help: consider introducing lifetime `'a` here
+ |
+LL | fn main<'a>() {
+ | ++++
+
+error[E0261]: use of undeclared lifetime name `'b`
+ --> $DIR/suggestion-for-introducing-lifetime-into-binder.rs:5:18
+ |
+LL | for<'a> |_: &'b ()| -> () {};
+ | ^^ undeclared lifetime
+ |
+help: consider introducing lifetime `'b` here
+ |
+LL | for<'b, 'a> |_: &'b ()| -> () {};
+ | +++
+help: consider introducing lifetime `'b` here
+ |
+LL | fn main<'b>() {
+ | ++++
+
+error: aborting due to 2 previous errors
+
+For more information about this error, try `rustc --explain E0261`.