| //@ compile-flags: -Zmir-opt-level=0 | |
| // EMIT_MIR_FOR_EACH_PANIC_STRATEGY | |
| #![feature(offset_of_enum)] | |
| use std::marker::PhantomData; | |
| use std::mem::offset_of; | |
| struct Alpha { | |
| x: u8, | |
| y: u16, | |
| z: Beta, | |
| } | |
| struct Beta(u8, u8); | |
| struct Gamma<T> { | |
| x: u8, | |
| y: u16, | |
| _t: T, | |
| } | |
| #[repr(C)] | |
| struct Delta<T> { | |
| _phantom: PhantomData<T>, | |
| x: u8, | |
| y: u16, | |
| } | |
| enum Blah { | |
| A, | |
| B { x: u8, y: usize }, | |
| } | |
| // CHECK-LABEL: fn concrete( | |
| fn concrete() { | |
| // CHECK: debug x => [[x:_.*]]; | |
| // CHECK: debug y => [[y:_.*]]; | |
| // CHECK: debug h => [[h:_.*]]; | |
| // CHECK: debug z0 => [[z0:_.*]]; | |
| // CHECK: debug z1 => [[z1:_.*]]; | |
| // CHECK: [[x]] = const concrete::[[const_x:.*]]; | |
| let x = offset_of!(Alpha, x); | |
| // CHECK: [[y]] = const concrete::[[const_y:.*]]; | |
| let y = offset_of!(Alpha, y); | |
| // CHECK: [[h]] = const concrete::[[const_h:.*]]; | |
| let h = offset_of!(Blah, B.y); | |
| // CHECK: [[z0]] = const concrete::[[const_z0:.*]]; | |
| let z0 = offset_of!(Alpha, z.0); | |
| // CHECK: [[z1]] = const concrete::[[const_z1:.*]]; | |
| let z1 = offset_of!(Alpha, z.1); | |
| } | |
| // CHECK: concrete::[[const_x]]: usize | |
| // CHECK: _0 = offset_of::<Alpha>(const 0_u32, const 0_u32) | |
| // CHECK: concrete::[[const_y]]: usize | |
| // CHECK: _0 = offset_of::<Alpha>(const 0_u32, const 1_u32) | |
| // CHECK: concrete::[[const_h]]: usize | |
| // CHECK: _0 = offset_of::<Blah>(const 1_u32, const 1_u32) | |
| // CHECK: concrete::[[const_z0]]: usize | |
| // CHECK: [[z:_.*]] = offset_of::<Alpha>(const 0_u32, const 2_u32) | |
| // CHECK: [[z0:_.*]] = offset_of::<Beta>(const 0_u32, const 0_u32) | |
| // CHECK: [[sum:_.*]] = AddWithOverflow(copy [[z]], copy [[z0]]); | |
| // CHECK: _0 = move ([[sum]].0: usize); | |
| // CHECK: concrete::[[const_z1]]: usize | |
| // CHECK: [[z:_.*]] = offset_of::<Alpha>(const 0_u32, const 2_u32) | |
| // CHECK: [[z1:_.*]] = offset_of::<Beta>(const 0_u32, const 1_u32) | |
| // CHECK: [[sum:_.*]] = AddWithOverflow(copy [[z]], copy [[z1]]); | |
| // CHECK: _0 = move ([[sum]].0: usize); | |
| // CHECK-LABEL: fn generic( | |
| fn generic<T>() { | |
| // CHECK: debug gx => [[gx:_.*]]; | |
| // CHECK: debug gy => [[gy:_.*]]; | |
| // CHECK: debug dx => [[dx:_.*]]; | |
| // CHECK: debug dy => [[dy:_.*]]; | |
| // CHECK: [[gx]] = const generic::<T>::[[const_gx:.*]]; | |
| let gx = offset_of!(Gamma<T>, x); | |
| // CHECK: [[gy]] = const generic::<T>::[[const_gy:.*]]; | |
| let gy = offset_of!(Gamma<T>, y); | |
| // CHECK: [[dx]] = const generic::<T>::[[const_dx:.*]]; | |
| let dx = offset_of!(Delta<T>, x); | |
| // CHECK: [[dy]] = const generic::<T>::[[const_dy:.*]]; | |
| let dy = offset_of!(Delta<T>, y); | |
| } | |
| // CHECK: generic::[[const_gx]]: usize | |
| // CHECK: _0 = offset_of::<Gamma<T>>(const 0_u32, const 0_u32) | |
| // CHECK: generic::[[const_gy]]: usize | |
| // CHECK: _0 = offset_of::<Gamma<T>>(const 0_u32, const 1_u32) | |
| // CHECK: generic::[[const_dx]]: usize | |
| // CHECK: _0 = offset_of::<Delta<T>>(const 0_u32, const 1_u32) | |
| // CHECK: generic::[[const_dy]]: usize | |
| // CHECK: _0 = offset_of::<Delta<T>>(const 0_u32, const 2_u32) | |
| fn main() { | |
| concrete(); | |
| generic::<()>(); | |
| } |