]> git.lizzy.rs Git - rust.git/commitdiff
Fix tests for RFC 2203 in a `const`
authorDylan MacKenzie <ecstaticmorse@gmail.com>
Fri, 22 Nov 2019 18:45:49 +0000 (10:45 -0800)
committerDylan MacKenzie <ecstaticmorse@gmail.com>
Fri, 22 Nov 2019 19:01:31 +0000 (11:01 -0800)
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.

src/test/ui/consts/rfc-2203-const-array-repeat-exprs/const-fns.rs [deleted file]
src/test/ui/consts/rfc-2203-const-array-repeat-exprs/const-fns.stderr [deleted file]
src/test/ui/consts/rfc-2203-const-array-repeat-exprs/fn-call-in-const.rs [new file with mode: 0644]
src/test/ui/consts/rfc-2203-const-array-repeat-exprs/fn-call-in-non-const.rs [new file with mode: 0644]
src/test/ui/consts/rfc-2203-const-array-repeat-exprs/fn-call-in-non-const.stderr [new file with mode: 0644]

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 (file)
index 68a9227..0000000
+++ /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/const-fns.stderr b/src/test/ui/consts/rfc-2203-const-array-repeat-exprs/const-fns.stderr
deleted file mode 100644 (file)
index 82272af..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-error[E0277]: the trait bound `std::option::Option<Bar>: std::marker::Copy` is not satisfied
-  --> $DIR/const-fns.rs:18:35
-   |
-LL |     const ARR: [Option<Bar>; 2] = [type_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>
-   = note: the `Copy` trait is required because the repeated element will be copied
-
-error: aborting due to previous error
-
-For more information about this error, try `rustc --explain E0277`.
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 (file)
index 0000000..da1bae1
--- /dev/null
@@ -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 (file)
index 0000000..38f744e
--- /dev/null
@@ -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/fn-call-in-non-const.stderr b/src/test/ui/consts/rfc-2203-const-array-repeat-exprs/fn-call-in-non-const.stderr
new file mode 100644 (file)
index 0000000..8219d83
--- /dev/null
@@ -0,0 +1,13 @@
+error[E0277]: the trait bound `std::option::Option<Bar>: std::marker::Copy` is not satisfied
+  --> $DIR/fn-call-in-non-const.rs:16:31
+   |
+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>
+   = note: the `Copy` trait is required because the repeated element will be copied
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0277`.