]>
Commit | Line | Data |
---|---|---|
fc512014 XL |
1 | // compile-flags: -Cpanic=abort |
2 | #![feature(core_intrinsics)] | |
3 | #![crate_type = "lib"] | |
4 | ||
5 | // EMIT_MIR lower_intrinsics.wrapping.LowerIntrinsics.diff | |
6 | pub fn wrapping<T: Copy>(a: T, b: T) { | |
7 | let _x = core::intrinsics::wrapping_add(a, b); | |
8 | let _y = core::intrinsics::wrapping_sub(a, b); | |
9 | let _z = core::intrinsics::wrapping_mul(a, b); | |
10 | } | |
11 | ||
12 | // EMIT_MIR lower_intrinsics.size_of.LowerIntrinsics.diff | |
13 | pub fn size_of<T>() -> usize { | |
14 | core::intrinsics::size_of::<T>() | |
15 | } | |
16 | ||
17 | // EMIT_MIR lower_intrinsics.forget.LowerIntrinsics.diff | |
18 | pub fn forget<T>(t: T) { | |
5869c6ff | 19 | core::intrinsics::forget(t) |
fc512014 XL |
20 | } |
21 | ||
22 | // EMIT_MIR lower_intrinsics.unreachable.LowerIntrinsics.diff | |
23 | pub fn unreachable() -> ! { | |
24 | unsafe { core::intrinsics::unreachable() }; | |
25 | } | |
26 | ||
27 | // EMIT_MIR lower_intrinsics.f_unit.PreCodegen.before.mir | |
28 | pub fn f_unit() { | |
29 | f_dispatch(()); | |
30 | } | |
31 | ||
32 | ||
33 | // EMIT_MIR lower_intrinsics.f_u64.PreCodegen.before.mir | |
34 | pub fn f_u64() { | |
35 | f_dispatch(0u64); | |
36 | } | |
37 | ||
38 | #[inline(always)] | |
39 | pub fn f_dispatch<T>(t: T) { | |
40 | if std::mem::size_of::<T>() == 0 { | |
41 | f_zst(t); | |
42 | } else { | |
43 | f_non_zst(t); | |
44 | } | |
45 | } | |
46 | ||
47 | #[inline(never)] | |
48 | pub fn f_zst<T>(_t: T) { | |
49 | } | |
50 | ||
51 | #[inline(never)] | |
52 | pub fn f_non_zst<T>(_t: T) {} | |
53 | ||
54 | // EMIT_MIR lower_intrinsics.non_const.LowerIntrinsics.diff | |
55 | pub fn non_const<T>() -> usize { | |
56 | // Check that lowering works with non-const operand as a func. | |
57 | let size_of_t = core::intrinsics::size_of::<T>; | |
58 | size_of_t() | |
59 | } | |
60 | ||
61 | pub enum E { | |
62 | A, | |
63 | B, | |
64 | C, | |
65 | } | |
66 | ||
67 | // EMIT_MIR lower_intrinsics.discriminant.LowerIntrinsics.diff | |
68 | pub fn discriminant<T>(t: T) { | |
69 | core::intrinsics::discriminant_value(&t); | |
70 | core::intrinsics::discriminant_value(&0); | |
71 | core::intrinsics::discriminant_value(&()); | |
72 | core::intrinsics::discriminant_value(&E::B); | |
73 | } |