about summary refs log tree commit diff
path: root/src/test/ui/closures
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/ui/closures')
-rw-r--r--src/test/ui/closures/coerce-unsafe-closure-to-unsafe-fn-ptr.rs5
-rw-r--r--src/test/ui/closures/coerce-unsafe-closure-to-unsafe-fn-ptr.stderr11
-rw-r--r--src/test/ui/closures/coerce-unsafe-to-closure.rs4
-rw-r--r--src/test/ui/closures/coerce-unsafe-to-closure.stderr11
-rw-r--r--src/test/ui/closures/old-closure-arg-call-as.rs12
-rw-r--r--src/test/ui/closures/old-closure-arg.rs11
-rw-r--r--src/test/ui/closures/old-closure-explicit-types.rs6
-rw-r--r--src/test/ui/closures/old-closure-expr-precedence.rs62
-rw-r--r--src/test/ui/closures/old-closure-expr-precedence.stderr10
-rw-r--r--src/test/ui/closures/old-closure-expression-remove-semicolon.fixed12
-rw-r--r--src/test/ui/closures/old-closure-expression-remove-semicolon.rs12
-rw-r--r--src/test/ui/closures/old-closure-expression-remove-semicolon.stderr14
-rw-r--r--src/test/ui/closures/old-closure-fn-coerce.rs11
-rw-r--r--src/test/ui/closures/old-closure-iter-1.rs15
-rw-r--r--src/test/ui/closures/old-closure-iter-2.rs15
15 files changed, 211 insertions, 0 deletions
diff --git a/src/test/ui/closures/coerce-unsafe-closure-to-unsafe-fn-ptr.rs b/src/test/ui/closures/coerce-unsafe-closure-to-unsafe-fn-ptr.rs
new file mode 100644
index 00000000000..36777693fab
--- /dev/null
+++ b/src/test/ui/closures/coerce-unsafe-closure-to-unsafe-fn-ptr.rs
@@ -0,0 +1,5 @@
+fn main() {
+    let _: unsafe fn() = || { ::std::pin::Pin::new_unchecked(&0_u8); };
+    //~^ ERROR E0133
+    let _: unsafe fn() = || unsafe { ::std::pin::Pin::new_unchecked(&0_u8); }; // OK
+}
diff --git a/src/test/ui/closures/coerce-unsafe-closure-to-unsafe-fn-ptr.stderr b/src/test/ui/closures/coerce-unsafe-closure-to-unsafe-fn-ptr.stderr
new file mode 100644
index 00000000000..a1fb1c02e46
--- /dev/null
+++ b/src/test/ui/closures/coerce-unsafe-closure-to-unsafe-fn-ptr.stderr
@@ -0,0 +1,11 @@
+error[E0133]: call to unsafe function is unsafe and requires unsafe function or block
+  --> $DIR/coerce-unsafe-closure-to-unsafe-fn-ptr.rs:2:31
+   |
+LL |     let _: unsafe fn() = || { ::std::pin::Pin::new_unchecked(&0_u8); };
+   |                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ call to unsafe function
+   |
+   = note: consult the function's documentation for information on how to avoid undefined behavior
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0133`.
diff --git a/src/test/ui/closures/coerce-unsafe-to-closure.rs b/src/test/ui/closures/coerce-unsafe-to-closure.rs
new file mode 100644
index 00000000000..78bdd36f9cc
--- /dev/null
+++ b/src/test/ui/closures/coerce-unsafe-to-closure.rs
@@ -0,0 +1,4 @@
+fn main() {
+    let x: Option<&[u8]> = Some("foo").map(std::mem::transmute);
+    //~^ ERROR E0277
+}
diff --git a/src/test/ui/closures/coerce-unsafe-to-closure.stderr b/src/test/ui/closures/coerce-unsafe-to-closure.stderr
new file mode 100644
index 00000000000..ab035d03b05
--- /dev/null
+++ b/src/test/ui/closures/coerce-unsafe-to-closure.stderr
@@ -0,0 +1,11 @@
+error[E0277]: expected a `FnOnce<(&str,)>` closure, found `unsafe extern "rust-intrinsic" fn(_) -> _ {transmute::<_, _>}`
+  --> $DIR/coerce-unsafe-to-closure.rs:2:44
+   |
+LL |     let x: Option<&[u8]> = Some("foo").map(std::mem::transmute);
+   |                                            ^^^^^^^^^^^^^^^^^^^ expected an `FnOnce<(&str,)>` closure, found `unsafe extern "rust-intrinsic" fn(_) -> _ {transmute::<_, _>}`
+   |
+   = help: the trait `FnOnce<(&str,)>` is not implemented for `unsafe extern "rust-intrinsic" fn(_) -> _ {transmute::<_, _>}`
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0277`.
diff --git a/src/test/ui/closures/old-closure-arg-call-as.rs b/src/test/ui/closures/old-closure-arg-call-as.rs
new file mode 100644
index 00000000000..87cf3a487bf
--- /dev/null
+++ b/src/test/ui/closures/old-closure-arg-call-as.rs
@@ -0,0 +1,12 @@
+// run-pass
+
+#![allow(non_snake_case)]
+
+fn asBlock<F>(f: F) -> usize where F: FnOnce() -> usize {
+   return f();
+}
+
+pub fn main() {
+   let x = asBlock(|| 22);
+   assert_eq!(x, 22);
+}
diff --git a/src/test/ui/closures/old-closure-arg.rs b/src/test/ui/closures/old-closure-arg.rs
new file mode 100644
index 00000000000..bd1385e5c33
--- /dev/null
+++ b/src/test/ui/closures/old-closure-arg.rs
@@ -0,0 +1,11 @@
+// run-pass
+// Check usage and precedence of block arguments in expressions:
+pub fn main() {
+    let v = vec![-1.0f64, 0.0, 1.0, 2.0, 3.0];
+
+    // Statement form does not require parentheses:
+    for i in &v {
+        println!("{}", *i);
+    }
+
+}
diff --git a/src/test/ui/closures/old-closure-explicit-types.rs b/src/test/ui/closures/old-closure-explicit-types.rs
new file mode 100644
index 00000000000..860fcc8df21
--- /dev/null
+++ b/src/test/ui/closures/old-closure-explicit-types.rs
@@ -0,0 +1,6 @@
+// run-pass
+
+pub fn main() {
+    fn as_buf<T, F>(s: String, f: F) -> T where F: FnOnce(String) -> T { f(s) }
+    as_buf("foo".to_string(), |foo: String| -> () { println!("{}", foo) });
+}
diff --git a/src/test/ui/closures/old-closure-expr-precedence.rs b/src/test/ui/closures/old-closure-expr-precedence.rs
new file mode 100644
index 00000000000..13b2fe9c3d1
--- /dev/null
+++ b/src/test/ui/closures/old-closure-expr-precedence.rs
@@ -0,0 +1,62 @@
+// run-pass
+
+#![allow(unused_must_use)]
+#![allow(unused_parens)]
+// This test has some extra semis in it that the pretty-printer won't
+// reproduce so we don't want to automatically reformat it
+
+// no-reformat
+
+
+/*
+ *
+ *  When you write a block-expression thing followed by
+ *  a lone unary operator, you can get a surprising parse:
+ *
+ *  if (...) { ... }
+ *  -num;
+ *
+ * for example, or:
+ *
+ *  if (...) { ... }
+ *  *box;
+ *
+ * These will parse as subtraction and multiplication binops.
+ * To get them to parse "the way you want" you need to brace
+ * the leading unops:
+
+ *  if (...) { ... }
+ *  {-num};
+ *
+ * or alternatively, semi-separate them:
+ *
+ *  if (...) { ... };
+ *  -num;
+ *
+ * This seems a little wonky, but the alternative is to lower
+ * precedence of such block-like exprs to the point where
+ * you have to parenthesize them to get them to occur in the
+ * RHS of a binop. For example, you'd have to write:
+ *
+ *   12 + (if (foo) { 13 } else { 14 });
+ *
+ * rather than:
+ *
+ *   12 + if (foo) { 13 } else { 14 };
+ *
+ * Since we want to maintain the ability to write the latter,
+ * we leave the parens-burden on the trailing unop case.
+ *
+ */
+
+pub fn main() {
+
+  let num = 12;
+
+  assert_eq!(if (true) { 12 } else { 12 } - num, 0);
+  assert_eq!(12 - if (true) { 12 } else { 12 }, 0);
+  if (true) { 12; } {-num};
+  if (true) { 12; }; {-num};
+  if (true) { 12; };;; -num;
+  //~^ WARNING unnecessary trailing semicolons
+}
diff --git a/src/test/ui/closures/old-closure-expr-precedence.stderr b/src/test/ui/closures/old-closure-expr-precedence.stderr
new file mode 100644
index 00000000000..fabece1ad4a
--- /dev/null
+++ b/src/test/ui/closures/old-closure-expr-precedence.stderr
@@ -0,0 +1,10 @@
+warning: unnecessary trailing semicolons
+  --> $DIR/old-closure-expr-precedence.rs:60:21
+   |
+LL |   if (true) { 12; };;; -num;
+   |                     ^^ help: remove these semicolons
+   |
+   = note: `#[warn(redundant_semicolons)]` on by default
+
+warning: 1 warning emitted
+
diff --git a/src/test/ui/closures/old-closure-expression-remove-semicolon.fixed b/src/test/ui/closures/old-closure-expression-remove-semicolon.fixed
new file mode 100644
index 00000000000..5629d4b6e6e
--- /dev/null
+++ b/src/test/ui/closures/old-closure-expression-remove-semicolon.fixed
@@ -0,0 +1,12 @@
+// run-rustfix
+
+fn foo() -> i32 {
+    0
+}
+
+fn main() {
+    let _x: i32 = {
+        //~^ ERROR mismatched types
+        foo() //~ HELP consider removing this semicolon
+    };
+}
diff --git a/src/test/ui/closures/old-closure-expression-remove-semicolon.rs b/src/test/ui/closures/old-closure-expression-remove-semicolon.rs
new file mode 100644
index 00000000000..33f11b50afc
--- /dev/null
+++ b/src/test/ui/closures/old-closure-expression-remove-semicolon.rs
@@ -0,0 +1,12 @@
+// run-rustfix
+
+fn foo() -> i32 {
+    0
+}
+
+fn main() {
+    let _x: i32 = {
+        //~^ ERROR mismatched types
+        foo(); //~ HELP consider removing this semicolon
+    };
+}
diff --git a/src/test/ui/closures/old-closure-expression-remove-semicolon.stderr b/src/test/ui/closures/old-closure-expression-remove-semicolon.stderr
new file mode 100644
index 00000000000..ab7983dc9e4
--- /dev/null
+++ b/src/test/ui/closures/old-closure-expression-remove-semicolon.stderr
@@ -0,0 +1,14 @@
+error[E0308]: mismatched types
+  --> $DIR/old-closure-expression-remove-semicolon.rs:8:19
+   |
+LL |       let _x: i32 = {
+   |  ___________________^
+LL | |
+LL | |         foo();
+   | |              - help: consider removing this semicolon
+LL | |     };
+   | |_____^ expected `i32`, found `()`
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0308`.
diff --git a/src/test/ui/closures/old-closure-fn-coerce.rs b/src/test/ui/closures/old-closure-fn-coerce.rs
new file mode 100644
index 00000000000..d993ad99459
--- /dev/null
+++ b/src/test/ui/closures/old-closure-fn-coerce.rs
@@ -0,0 +1,11 @@
+// run-pass
+#![allow(unused_braces)]
+
+fn force<F>(f: F) -> isize where F: FnOnce() -> isize { return f(); }
+
+pub fn main() {
+    fn f() -> isize { return 7; }
+    assert_eq!(force(f), 7);
+    let g = {||force(f)};
+    assert_eq!(g(), 7);
+}
diff --git a/src/test/ui/closures/old-closure-iter-1.rs b/src/test/ui/closures/old-closure-iter-1.rs
new file mode 100644
index 00000000000..caf0266cff1
--- /dev/null
+++ b/src/test/ui/closures/old-closure-iter-1.rs
@@ -0,0 +1,15 @@
+// run-pass
+
+fn iter_vec<T, F>(v: Vec<T> , mut f: F) where F: FnMut(&T) { for x in &v { f(x); } }
+
+pub fn main() {
+    let v = vec![1, 2, 3, 4, 5, 6, 7];
+    let mut odds = 0;
+    iter_vec(v, |i| {
+        if *i % 2 == 1 {
+            odds += 1;
+        }
+    });
+    println!("{}", odds);
+    assert_eq!(odds, 4);
+}
diff --git a/src/test/ui/closures/old-closure-iter-2.rs b/src/test/ui/closures/old-closure-iter-2.rs
new file mode 100644
index 00000000000..e90c1ee815a
--- /dev/null
+++ b/src/test/ui/closures/old-closure-iter-2.rs
@@ -0,0 +1,15 @@
+// run-pass
+
+fn iter_vec<T, F>(v: Vec<T>, mut f: F) where F: FnMut(&T) { for x in &v { f(x); } }
+
+pub fn main() {
+    let v = vec![1, 2, 3, 4, 5];
+    let mut sum = 0;
+    iter_vec(v.clone(), |i| {
+        iter_vec(v.clone(), |j| {
+            sum += *i * *j;
+        });
+    });
+    println!("{}", sum);
+    assert_eq!(sum, 225);
+}