diff options
| author | Dylan MacKenzie <ecstaticmorse@gmail.com> | 2019-11-22 10:45:49 -0800 |
|---|---|---|
| committer | Dylan MacKenzie <ecstaticmorse@gmail.com> | 2019-11-22 11:01:31 -0800 |
| commit | fcf4bee7d3d69356a9eb702f9e0a9ddba238d33f (patch) | |
| tree | 55c85d4cef0c4295f5e73960a25e03f2e02080e4 | |
| parent | 53712f8637dbe326df569a90814aae1cc5429710 (diff) | |
| download | rust-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.rs | 26 | ||||
| -rw-r--r-- | src/test/ui/consts/rfc-2203-const-array-repeat-exprs/fn-call-in-const.rs | 23 | ||||
| -rw-r--r-- | src/test/ui/consts/rfc-2203-const-array-repeat-exprs/fn-call-in-non-const.rs | 18 | ||||
| -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> |
