| //@ 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() {} |