| // skip-filecheck | |
| #![feature(try_trait_v2)] | |
| //@ compile-flags: -Zunsound-mir-opts | |
| use std::ops::ControlFlow; | |
| // EMIT_MIR separate_const_switch.too_complex.JumpThreading.diff | |
| fn too_complex(x: Result<i32, usize>) -> Option<i32> { | |
| // The pass should break the outer match into | |
| // two blocks that only have one parent each. | |
| // Parents are one of the two branches of the first | |
| // match, so a later pass can propagate constants. | |
| match { | |
| match x { | |
| Ok(v) => ControlFlow::Continue(v), | |
| Err(r) => ControlFlow::Break(r), | |
| } | |
| } { | |
| ControlFlow::Continue(v) => Some(v), | |
| ControlFlow::Break(r) => None, | |
| } | |
| } | |
| // EMIT_MIR separate_const_switch.identity.JumpThreading.diff | |
| fn identity(x: Result<i32, i32>) -> Result<i32, i32> { | |
| Ok(x?) | |
| } | |
| fn main() { | |
| too_complex(Ok(0)); | |
| identity(Ok(0)); | |
| } |