diff options
| author | DianQK <dianqk@dianqk.net> | 2024-12-09 20:25:41 +0800 |
|---|---|---|
| committer | DianQK <dianqk@dianqk.net> | 2024-12-09 21:06:29 +0800 |
| commit | d0986f45e094b011d132238563b05c09e4f1e20e (patch) | |
| tree | 0b78a7e65bbba6f4250ae4f998a61c82b9a0a3ed | |
| parent | 1b3fb316751227d30b1523ed0e3f00d83956d4d0 (diff) | |
| download | rust-d0986f45e094b011d132238563b05c09e4f1e20e.tar.gz rust-d0986f45e094b011d132238563b05c09e4f1e20e.zip | |
dataflow_const_prop: do not eval a ptr address in SwitchInt
| -rw-r--r-- | compiler/rustc_mir_transform/src/dataflow_const_prop.rs | 9 | ||||
| -rw-r--r-- | tests/crashes/131227.rs | 16 | ||||
| -rw-r--r-- | tests/ui/dataflow_const_prop/ptr-in-switch-int-issue-131227.rs | 19 |
3 files changed, 26 insertions, 18 deletions
diff --git a/compiler/rustc_mir_transform/src/dataflow_const_prop.rs b/compiler/rustc_mir_transform/src/dataflow_const_prop.rs index d017202f48b..b94c925b1db 100644 --- a/compiler/rustc_mir_transform/src/dataflow_const_prop.rs +++ b/compiler/rustc_mir_transform/src/dataflow_const_prop.rs @@ -534,8 +534,13 @@ impl<'a, 'tcx> ConstAnalysis<'a, 'tcx> { // This allows the set of visited edges to grow monotonically with the lattice. FlatSet::Bottom => TerminatorEdges::None, FlatSet::Elem(scalar) => { - let choice = scalar.assert_scalar_int().to_bits_unchecked(); - TerminatorEdges::Single(targets.target_for_value(choice)) + if let Ok(scalar_int) = scalar.try_to_scalar_int() { + TerminatorEdges::Single( + targets.target_for_value(scalar_int.to_bits_unchecked()), + ) + } else { + TerminatorEdges::SwitchInt { discr, targets } + } } FlatSet::Top => TerminatorEdges::SwitchInt { discr, targets }, } diff --git a/tests/crashes/131227.rs b/tests/crashes/131227.rs deleted file mode 100644 index f46185b5b4a..00000000000 --- a/tests/crashes/131227.rs +++ /dev/null @@ -1,16 +0,0 @@ -//@ known-bug: #131227 -//@ compile-flags: -Zmir-opt-level=3 - -static mut G: () = (); - -fn myfunc() -> i32 { - let var = &raw mut G; - if var.is_null() { - return 0; - } - 0 -} - -fn main() { - myfunc(); -} diff --git a/tests/ui/dataflow_const_prop/ptr-in-switch-int-issue-131227.rs b/tests/ui/dataflow_const_prop/ptr-in-switch-int-issue-131227.rs new file mode 100644 index 00000000000..7a55e13d0ee --- /dev/null +++ b/tests/ui/dataflow_const_prop/ptr-in-switch-int-issue-131227.rs @@ -0,0 +1,19 @@ +//! Issue: <https://github.com/rust-lang/rust/issues/131227> +//! Test that constant propagation in SwitchInt does not crash +//! when encountering a ptr-to-int transmute. + +//@ check-pass +//@ compile-flags: -Zmir-enable-passes=+InstSimplify-before-inline,+DataflowConstProp + +#![crate_type = "lib"] + +static mut G: i32 = 0; + +pub fn myfunc() -> i32 { + let var = &raw mut G; + let u: usize = unsafe { std::mem::transmute(var) }; + match u { + 0 => 0, + _ => 1, + } +} |
