rust/tests/mir-opt/copy-prop/reborrow.remut.CopyProp.panic-unwind.diff
Tomasz Miąsko 6bd1a031ab Turn moves into copies after copy propagation
Previously copy propagation presumed that there is further unspecified
distinction between move operands and copy operands in assignments and
propagated moves from assignments into terminators. This is inconsistent
with current operational semantics.

Turn moves into copies after copy propagation to preserve existing behavior.

Fixes https://github.com/rust-lang/rust/issues/137936.
Fixes https://github.com/rust-lang/rust/issues/146423.
2025-11-20 19:23:10 +01:00

47 lines
1.1 KiB
Diff

- // MIR for `remut` before CopyProp
+ // MIR for `remut` after CopyProp
fn remut(_1: u8) -> () {
debug x => _1;
let mut _0: ();
let _2: &mut u8;
let _5: ();
let mut _6: &mut u8;
scope 1 {
debug a => _2;
let _3: &mut u8;
scope 2 {
debug b => _3;
let _4: &mut u8;
scope 3 {
- debug c => _4;
+ debug c => _2;
}
}
}
bb0: {
- StorageLive(_2);
_2 = &mut _1;
StorageLive(_3);
_3 = &mut (*_2);
- StorageLive(_4);
- _4 = move _2;
StorageLive(_5);
- StorageLive(_6);
- _6 = move _4;
- _5 = opaque::<&mut u8>(move _6) -> [return: bb1, unwind continue];
+ _5 = opaque::<&mut u8>(copy _2) -> [return: bb1, unwind continue];
}
bb1: {
- StorageDead(_6);
StorageDead(_5);
_0 = const ();
- StorageDead(_4);
StorageDead(_3);
- StorageDead(_2);
return;
}
}