//@ compile-flags: -Zmir-opt-level=0 // skip-filecheck // EMIT_MIR enum_cast.foo.built.after.mir // EMIT_MIR enum_cast.bar.built.after.mir // EMIT_MIR enum_cast.boo.built.after.mir // EMIT_MIR enum_cast.far.built.after.mir // Previously MIR building included range `Assume`s in the MIR statements, // which these tests demonstrated, but now that we have range metadata on // parameters in LLVM (in addition to !range metadata on loads) the impact // of the extra volume of MIR is worse than its value. // Thus these are now about the discriminant type and the cast type, // both of which might be different from the backend type of the tag. enum Foo { A, } enum Bar { A, B, } #[repr(u8)] enum Boo { A, B, } #[repr(i16)] enum Far { A, B, } fn foo(foo: Foo) -> usize { foo as usize } fn bar(bar: Bar) -> usize { bar as usize } fn boo(boo: Boo) -> usize { boo as usize } fn far(far: Far) -> isize { far as isize } #[repr(i16)] enum SignedAroundZero { A = -2, B = 0, C = 2, } #[repr(u16)] enum UnsignedAroundZero { A = 65535, B = 0, C = 1, } // EMIT_MIR enum_cast.signy.built.after.mir fn signy(x: SignedAroundZero) -> i16 { x as i16 } // EMIT_MIR enum_cast.unsigny.built.after.mir fn unsigny(x: UnsignedAroundZero) -> u16 { // FIXME: This doesn't get an around-the-end range today, sadly. x as u16 } enum NotStartingAtZero { A = 4, B = 6, C = 8, } // EMIT_MIR enum_cast.offsetty.built.after.mir fn offsetty(x: NotStartingAtZero) -> u32 { x as u32 } fn main() {}