Evaluating constants in MIR optimizations introduces const eval errors
Open
Nobody has claimed this yet.
A-const-eval
A-mir-opt
A-monomorphization
C-bug
T-compiler
- Dominant language
- Rust
- Stars
- 119k
- Forks
- 16.2k
- PR merge metrics
- PR metrics pending
Description
#![feature(inline_const)]
#![crate_type = "lib"]
pub fn f<T>() -> usize {
g::<()>()
}
pub fn g<T>() -> usize {
const { 0 / std::mem::size_of::<T>() }
}
This compiles fine in debug builds, but fails in release builds:
$ rustc b.rs
$ rustc b.rs -O
error[E0080]: evaluation of `g::<()>::{constant#0}` failed
--> b.rs:7:13
|
7 | const { 0 / std::mem::size_of::<T>() }
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ attempt to divide `0_usize` by zero
error: aborting due to 1 previous error
For more information about this error, try `rustc --explain E0080`.
Based on https://github.com/rust-lang/rust/issues/107503#issuecomment-2011659833 cc @RalfJung.
But also see this example based on type sizes.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by reproducing the issue with the supplied generic Rust example using rustc with and without -O, then trace how MIR optimizations evaluate the inline const expression. Identify the const-evaluation path responsible for the release-only error and add a regression test showing consistent behavior between debug and optimized builds.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- rust
- Domain
- compilers
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100