rust/compiler/rustc_session/src
Chris Denton 5d2375f789
Rollup merge of #139042 - compiler-errors:do-not-optimize-switchint, r=saethlin
Do not remove trivial `SwitchInt` in analysis MIR

This PR ensures that we don't prematurely remove trivial `SwitchInt` terminators which affects both the borrow-checking and runtime semantics (i.e. UB) of the code. Previously the `SimplifyCfg` optimization was removing `SwitchInt` terminators when they was "trivial", i.e. when all arms branched to the same basic block, even if that `SwitchInt` terminator had the side-effect of reading an operand which (for example) may not be initialized or may point to an invalid place in memory.

This behavior is unlike all other optimizations, which are only applied after "analysis" (i.e. borrow-checking) is finished, and which Miri disables to make sure the compiler doesn't silently remove UB.

Fixing this code "breaks" (i.e. unmasks) code that used to borrow-check but no longer does, like:

```rust
fn foo() {
    let x;
    let (0 | _) = x;
}
```

This match expression should perform a read because `_` does not shadow the `0` literal pattern, and the compiler should have to read the match scrutinee to compare it to 0. I've checked that this behavior does not actually manifest in practice via a crater run which came back clean: https://github.com/rust-lang/rust/pull/139042#issuecomment-2767436367

As a side-note, it may be tempting to suggest that this is actually a good thing or that we should preserve this behavior. If we wanted to make this work (i.e. trivially optimize out reads from matches that are redundant like `0 | _`), then we should be enabling this behavior *after* fixing this. However, I think it's kinda unprincipled, and for example other variations of the code don't even work today, e.g.:

```rust
fn foo() {
    let x;
    let (0.. | _) = x;
}
```
2025-04-19 19:30:46 +00:00
..
config Add unstable foo::bar extern command line arguments 2025-04-15 13:04:50 -07:00
code_stats.rs Make CodeStat's type sizes a public field 2025-04-16 02:10:53 +02:00
config.rs Rollup merge of #139850 - xizheyin:issue-138698, r=jieyouxu 2025-04-17 17:40:27 +02:00
cstore.rs Update comments 2024-12-19 15:30:32 +00:00
errors.rs Auto merge of #138947 - madsmtm:refactor-apple-versions, r=Noratrieb 2025-04-06 10:16:28 +00:00
filesearch.rs Cache current_dll_path output 2025-03-21 12:46:24 +00:00
lib.rs Remove #![warn(unreachable_pub)] from all compiler/ crates. 2025-03-11 13:14:21 +11:00
options.rs Rollup merge of #139042 - compiler-errors:do-not-optimize-switchint, r=saethlin 2025-04-19 19:30:46 +00:00
output.rs Auto merge of #138906 - thaliaarchi:unsupported-test-exe, r=bjorn3 2025-04-15 16:05:15 +00:00
parse.rs Greatly simplify lifetime captures in edition 2024 2025-02-22 22:24:52 +00:00
search_paths.rs Greatly simplify lifetime captures in edition 2024 2025-02-22 22:24:52 +00:00
session.rs Stabilize -Zdwarf-version as -Cdwarf-version 2025-04-14 21:26:41 -05:00
utils.rs use slice::contains where applicable 2025-03-28 12:21:21 +00:00