-
Notifications
You must be signed in to change notification settings - Fork 14k
Closed as not planned
Closed as not planned
Copy link
Description
I have the following code:
trait Foo {
const FOO: ();
}
impl Foo for () {
const FOO: () = unimplemented!();
}
pub fn foo() {
let _: () = <() as Foo>::FOO;
}Running cargo check succeeds, while cargo build fails:
$ cargo build
Compiling check-panicking-const v0.1.0 (.../check-panicking-const)
error[E0080]: evaluation of constant value failed
--> src/lib.rs:6:21
|
6 | const FOO: () = unimplemented!();
| ^^^^^^^^^^^^^^^^ the evaluated program panicked at 'not implemented', src/lib.rs:6:21
|
= note: this error originates in the macro `unimplemented` (in Nightly builds, run with -Z macro-backtrace for more info)
note: erroneous constant used
--> src/lib.rs:10:17
|
10 | let _: () = <() as Foo>::FOO;
| ^^^^^^^^^^^^^^^^
For more information about this error, try `rustc --explain E0080`.
error: could not compile `check-panicking-const` (lib) due to previous error
I would expect cargo build and cargo check to exhibit the same behavior.
This has practical implications. For example, I'm working on implementing this technique in zerocopy, which intentionally generates panicking constants when an unsound transmutation is attempted. The behavior mismatch between cargo check and cargo build means that unsound transmutes appear to compile until the user runs cargo build. For users who primarily use cargo check during development (I am included in this group), this can result in spending a lot of time going down a path that will end up with a dead end.
This is an instance of #70923.
Version
$ cargo --version
cargo 1.72.0-nightly (b0fa79679 2023-06-03)
Metadata
Metadata
Assignees
Labels
No labels