| //@ run-pass | |
| // Bad regression test for https://github.com/rust-lang/rust/issues/159035 | |
| // This should probably be replaced with a codegen test, though that might need to be in LLVM, | |
| // as it seems that the miscompilation may occur on correct IR misoptimized by SimplifyCFG. | |
| #![allow(dead_code)] | |
| enum Inner { | |
| A(u32), | |
| B(u32), | |
| } | |
| struct Big { | |
| _pad: u64, | |
| inner: Inner, | |
| } | |
| struct Small { | |
| a: u16, | |
| b: u16, | |
| _f: fn(), | |
| } | |
| enum Checksum { | |
| X(Big), | |
| Y(Small), | |
| } | |
| impl Checksum { | |
| fn finalize(self) -> u32 { | |
| match self { | |
| Checksum::X(h) => match h.inner { | |
| Inner::A(s) => s, | |
| Inner::B(s) => s, | |
| }, | |
| Checksum::Y(s) => (u32::from(s.b) << 16) | u32::from(s.a), | |
| } | |
| } | |
| } | |
| #[inline(never)] | |
| fn run(c: Option<Checksum>) -> Option<u32> { | |
| c.map(|c| c.finalize()) | |
| } | |
| fn main() { | |
| println!("{:?}", run(std::hint::black_box(None))); | |
| } |