| //@ run-pass | 
 | #![allow(dead_code)] | 
 |  | 
 | /*! | 
 |  * C-like enums have to be represented as LLVM ints, not wrapped in a | 
 |  * struct, because it's important for the FFI that they interoperate | 
 |  * with C integers/enums, and the ABI can treat structs differently. | 
 |  * For example, on i686-linux-gnu, a struct return value is passed by | 
 |  * storing to a hidden out parameter, whereas an integer would be | 
 |  * returned in a register. | 
 |  * | 
 |  * This test just checks that the ABIs for the enum and the plain | 
 |  * integer are compatible, rather than actually calling C code. | 
 |  * The unused parameter to `foo` is to increase the likelihood of | 
 |  * crashing if something goes wrong here. | 
 |  */ | 
 |  | 
 | #[repr(u32)] | 
 | enum Foo { | 
 |     A = 0, | 
 |     B = 23 | 
 | } | 
 |  | 
 | #[inline(never)] | 
 | extern "C" fn foo(_x: usize) -> Foo { Foo::B } | 
 |  | 
 | pub fn main() { | 
 |     unsafe { | 
 |         let f: extern "C" fn(usize) -> u32 = | 
 |             ::std::mem::transmute(foo as extern "C" fn(usize) -> Foo); | 
 |         assert_eq!(f(0xDEADBEEF), Foo::B as u32); | 
 |     } | 
 | } |