rust/tests/ui/consts/miri_unleashed
Matthias Krüger 8e4c70f02b
Rollup merge of #148746 - RalfJung:mutable-ref-in-const, r=davidtwco
const validation: remove check for mutable refs in final value of const

This check rejects code that is not necessarily UB, e.g. a mutable ref to a `static mut` that is very carefully used correctly. That led to us having to describe it in the Reference, which uncovered just how ad-hoc this check is (https://github.com/rust-lang/reference/issues/2074).

Even without this check, we still reject things like
```rust
const C: &mut i32 = &mut 0;
```
This is rejected by const checking -- the part of the frontend that looks at the source code and says whether it is allowed in const context. In the Reference, this restriction is explained [here](https://doc.rust-lang.org/nightly/reference/const_eval.html#r-const-eval.const-expr.borrows).

So, the check during validation is just a safety net. And it is already a safety net with gaping holes since we only check `&mut T`, not `&UnsafeCell<T>`, due to the fact that we promote some immutable values that have `!Freeze` type so `&!Freeze` actually can occur in the final value of a const.

So... it may be time for me to acknowledge that the "mutable ref in final value of const" check is a cure that's worth than the disease. Nobody asked for that check, I just added it because I was worried about soundness issues when we allow mutable references in constants. Originally it was much stricter, but I had to slowly relax it to its current form to prevent t from firing on code we intend to allow. In the end there are only 3 tests left that trigger this error, and they are all just constants containing references to mutable statics -- not the safest code in the world, but also not so bad that we have to spend a lot of time devising a core language limitation and associated Reference wording to prevent it from ever happening.

So... `@rust-lang/wg-const-eval` `@rust-lang/lang`  I propose that we allow code like this
```rust
static mut S: i32 = 3;
const C2: &'static mut i32 = unsafe { &mut * &raw mut S };
```
`@theemathas` would be great if you could try to poke a hole into this. ;)
2025-11-29 20:54:05 +01:00
..
auxiliary Move /src/test to /tests 2023-01-11 09:32:08 +00:00
abi-mismatch.rs const-eval error: always say in which item the error occurred 2025-06-07 13:42:30 +02:00
abi-mismatch.stderr const-eval error: always say in which item the error occurred 2025-06-07 13:42:30 +02:00
assoc_const.rs compiletest: Support matching on diagnostics without a span 2025-03-25 17:33:09 +03:00
assoc_const.stderr const-eval error: always say in which item the error occurred 2025-06-07 13:42:30 +02:00
assoc_const_2.rs Use the informative error as the main const eval error message 2025-06-02 15:37:15 +00:00
assoc_const_2.stderr Clarify why we are talking about a failed const eval at a random place 2025-06-02 15:37:15 +00:00
box.rs Use the informative error as the main const eval error message 2025-06-02 15:37:15 +00:00
box.stderr const-eval error: always say in which item the error occurred 2025-06-07 13:42:30 +02:00
const_refers_to_static.rs const-eval: allow constants to refer to mutable/external memory, but reject such constants as patterns 2025-06-26 18:09:47 +02:00
const_refers_to_static.stderr Fix typo in error message 2025-09-14 17:55:33 -04:00
const_refers_to_static_cross_crate.rs const-eval: allow constants to refer to mutable/external memory, but reject such constants as patterns 2025-06-26 18:09:47 +02:00
const_refers_to_static_cross_crate.stderr Fix typo in error message 2025-09-14 17:55:33 -04:00
drop.rs const-eval error: always say in which item the error occurred 2025-06-07 13:42:30 +02:00
drop.stderr const-eval error: always say in which item the error occurred 2025-06-07 13:42:30 +02:00
extern-static.rs Use the informative error as the main const eval error message 2025-06-02 15:37:15 +00:00
extern-static.stderr const-eval error: always say in which item the error occurred 2025-06-07 13:42:30 +02:00
feature-gate-unleash_the_miri_inside_of_you.rs Move /src/test to /tests 2023-01-11 09:32:08 +00:00
feature-gate-unleash_the_miri_inside_of_you.stderr Show number in error message even for one error 2023-11-24 19:15:52 +01:00
inline_asm.rs Use the informative error as the main const eval error message 2025-06-02 15:37:15 +00:00
inline_asm.stderr const-eval error: always say in which item the error occurred 2025-06-07 13:42:30 +02:00
mutable_references.rs const validation: remove check for mutable refs in final value of const 2025-11-09 14:32:01 +01:00
mutable_references.stderr Rollup merge of #148746 - RalfJung:mutable-ref-in-const, r=davidtwco 2025-11-29 20:54:05 +01:00
mutating_global.rs Use the informative error as the main const eval error message 2025-06-02 15:37:15 +00:00
mutating_global.stderr const-eval error: always say in which item the error occurred 2025-06-07 13:42:30 +02:00
non_const_fn.rs Use the informative error as the main const eval error message 2025-06-02 15:37:15 +00:00
non_const_fn.stderr const-eval error: always say in which item the error occurred 2025-06-07 13:42:30 +02:00
ptr_arith.rs Use the informative error as the main const eval error message 2025-06-02 15:37:15 +00:00
ptr_arith.stderr const-eval error: always say in which item the error occurred 2025-06-07 13:42:30 +02:00
slice_eq.rs [AUTO-GENERATED] Migrate ui tests from // to //@ directives 2024-02-16 20:02:50 +00:00
static-no-inner-mut.32bit.stderr don't uppercase error messages 2025-09-03 15:24:49 +02:00
static-no-inner-mut.64bit.stderr don't uppercase error messages 2025-09-03 15:24:49 +02:00
static-no-inner-mut.rs Use the informative error as the main const eval error message 2025-06-02 15:37:15 +00:00
tls.rs Use the informative error as the main const eval error message 2025-06-02 15:37:15 +00:00
tls.stderr const-eval error: always say in which item the error occurred 2025-06-07 13:42:30 +02:00