#![feature(custom_mir, core_intrinsics)] extern crate core; use core::intrinsics::mir::*; union U { a: i32, b: u32, } // EMIT_MIR projections.unions.built.after.mir #[custom_mir(dialect = "built")] fn unions(u: U) -> i32 { mir!({ RET = u.a; Return() }) } // EMIT_MIR projections.tuples.built.after.mir #[custom_mir(dialect = "analysis", phase = "post-cleanup")] fn tuples(i: (u32, i32)) -> (u32, i32) { mir!( type RET = (u32, i32); { RET.0 = i.0; RET.1 = i.1; Return() } ) } // EMIT_MIR projections.unwrap.built.after.mir #[custom_mir(dialect = "built")] fn unwrap(opt: Option) -> i32 { mir!({ RET = Field(Variant(opt, 1), 0); Return() }) } // EMIT_MIR projections.unwrap_deref.built.after.mir #[custom_mir(dialect = "built")] fn unwrap_deref(opt: Option<&i32>) -> i32 { mir!({ RET = *Field::<&i32>(Variant(opt, 1), 0); Return() }) } // EMIT_MIR projections.set.built.after.mir #[custom_mir(dialect = "built")] fn set(opt: &mut Option) { mir!({ place!(Field(Variant(*opt, 1), 0)) = 10; Return() }) } // EMIT_MIR projections.simple_index.built.after.mir #[custom_mir(dialect = "built")] fn simple_index(a: [i32; 10], b: &[i32]) -> i32 { mir!({ let temp = 3; RET = a[temp]; RET = (*b)[temp]; Return() }) } // EMIT_MIR projections.copy_for_deref.built.after.mir #[custom_mir(dialect = "runtime", phase = "initial")] fn copy_for_deref(x: (&i32, i32)) -> i32 { mir!( let temp: &i32; { temp = CopyForDeref(x.0); RET = *temp; Return() } ) } fn main() { assert_eq!(unions(U { a: 5 }), 5); assert_eq!(tuples((5, 6)), (5, 6)); assert_eq!(unwrap(Some(5)), 5); assert_eq!(unwrap_deref(Some(&5)), 5); let mut o = Some(5); set(&mut o); assert_eq!(o, Some(10)); assert_eq!(simple_index([0; 10], &[0; 10]), 0); let one = 1; assert_eq!(copy_for_deref((&one, one)), 1); }