about summary refs log tree commit diff
diff options
context:
space:
mode:
authorDylan MacKenzie <ecstaticmorse@gmail.com>2019-11-22 10:45:49 -0800
committerDylan MacKenzie <ecstaticmorse@gmail.com>2019-11-22 11:01:31 -0800
commitfcf4bee7d3d69356a9eb702f9e0a9ddba238d33f (patch)
tree55c85d4cef0c4295f5e73960a25e03f2e02080e4
parent53712f8637dbe326df569a90814aae1cc5429710 (diff)
downloadrust-fcf4bee7d3d69356a9eb702f9e0a9ddba238d33f.tar.gz
rust-fcf4bee7d3d69356a9eb702f9e0a9ddba238d33f.zip
Fix tests for RFC 2203 in a `const`
The previous test was incorrect. `const fn`s are *always* promotable
when inside a `const`, so it should pass. The error was caused by a bug
in `promote_consts`. I've added a failing test outside a `const`
alongside the existing one, which is now run-pass.
-rw-r--r--src/test/ui/consts/rfc-2203-const-array-repeat-exprs/const-fns.rs26
-rw-r--r--src/test/ui/consts/rfc-2203-const-array-repeat-exprs/fn-call-in-const.rs23
-rw-r--r--src/test/ui/consts/rfc-2203-const-array-repeat-exprs/fn-call-in-non-const.rs18
-rw-r--r--src/test/ui/consts/rfc-2203-const-array-repeat-exprs/fn-call-in-non-const.stderr (renamed from src/test/ui/consts/rfc-2203-const-array-repeat-exprs/const-fns.stderr)6
4 files changed, 44 insertions, 29 deletions
diff --git a/src/test/ui/consts/rfc-2203-const-array-repeat-exprs/const-fns.rs b/src/test/ui/consts/rfc-2203-const-array-repeat-exprs/const-fns.rs
deleted file mode 100644
index 68a9227dea9..00000000000
--- a/src/test/ui/consts/rfc-2203-const-array-repeat-exprs/const-fns.rs
+++ /dev/null
@@ -1,26 +0,0 @@
-// ignore-tidy-linelength
-// ignore-compare-mode-nll
-#![feature(const_in_array_repeat_expressions, nll)]
-#![allow(warnings)]
-
-// Some type that is not copyable.
-struct Bar;
-
-const fn type_no_copy() -> Option<Bar> {
-    None
-}
-
-const fn type_copy() -> u32 {
-    3
-}
-
-fn no_copy() {
-    const ARR: [Option<Bar>; 2] = [type_no_copy(); 2];
-    //~^ ERROR the trait bound `std::option::Option<Bar>: std::marker::Copy` is not satisfied [E0277]
-}
-
-fn copy() {
-    const ARR: [u32; 2] = [type_copy(); 2];
-}
-
-fn main() {}
diff --git a/src/test/ui/consts/rfc-2203-const-array-repeat-exprs/fn-call-in-const.rs b/src/test/ui/consts/rfc-2203-const-array-repeat-exprs/fn-call-in-const.rs
new file mode 100644
index 00000000000..da1bae1be8d
--- /dev/null
+++ b/src/test/ui/consts/rfc-2203-const-array-repeat-exprs/fn-call-in-const.rs
@@ -0,0 +1,23 @@
+// run-pass
+
+#![allow(unused)]
+#![feature(const_in_array_repeat_expressions)]
+
+// Some type that is not copyable.
+struct Bar;
+
+const fn type_no_copy() -> Option<Bar> {
+    None
+}
+
+const fn type_copy() -> u32 {
+    3
+}
+
+const _: [u32; 2] = [type_copy(); 2];
+
+// This is allowed because all promotion contexts use the explicit rules for promotability when
+// inside an explicit const context.
+const _: [Option<Bar>; 2] = [type_no_copy(); 2];
+
+fn main() {}
diff --git a/src/test/ui/consts/rfc-2203-const-array-repeat-exprs/fn-call-in-non-const.rs b/src/test/ui/consts/rfc-2203-const-array-repeat-exprs/fn-call-in-non-const.rs
new file mode 100644
index 00000000000..38f744e99aa
--- /dev/null
+++ b/src/test/ui/consts/rfc-2203-const-array-repeat-exprs/fn-call-in-non-const.rs
@@ -0,0 +1,18 @@
+#![feature(const_in_array_repeat_expressions)]
+
+// Some type that is not copyable.
+struct Bar;
+
+const fn no_copy() -> Option<Bar> {
+    None
+}
+
+const fn copy() -> u32 {
+    3
+}
+
+fn main() {
+    let _: [u32; 2] = [copy(); 2];
+    let _: [Option<Bar>; 2] = [no_copy(); 2];
+    //~^ ERROR the trait bound `std::option::Option<Bar>: std::marker::Copy` is not satisfied
+}
diff --git a/src/test/ui/consts/rfc-2203-const-array-repeat-exprs/const-fns.stderr b/src/test/ui/consts/rfc-2203-const-array-repeat-exprs/fn-call-in-non-const.stderr
index 82272af958a..8219d836a20 100644
--- a/src/test/ui/consts/rfc-2203-const-array-repeat-exprs/const-fns.stderr
+++ b/src/test/ui/consts/rfc-2203-const-array-repeat-exprs/fn-call-in-non-const.stderr
@@ -1,8 +1,8 @@
 error[E0277]: the trait bound `std::option::Option<Bar>: std::marker::Copy` is not satisfied
-  --> $DIR/const-fns.rs:18:35
+  --> $DIR/fn-call-in-non-const.rs:16:31
    |
-LL |     const ARR: [Option<Bar>; 2] = [type_no_copy(); 2];
-   |                                   ^^^^^^^^^^^^^^^^^^^ the trait `std::marker::Copy` is not implemented for `std::option::Option<Bar>`
+LL |     let _: [Option<Bar>; 2] = [no_copy(); 2];
+   |                               ^^^^^^^^^^^^^^ the trait `std::marker::Copy` is not implemented for `std::option::Option<Bar>`
    |
    = help: the following implementations were found:
              <std::option::Option<T> as std::marker::Copy>