]> git.lizzy.rs Git - rust.git/blob - src/test/mir-opt/lower_intrinsics.rs
Rollup merge of #100247 - cjgillot:verify-dyn-trait-alias-defaults, r=lcnr
[rust.git] / src / test / mir-opt / lower_intrinsics.rs
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(a: i32, b: i32) {
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.align_of.LowerIntrinsics.diff
18 pub fn align_of<T>() -> usize {
19     core::intrinsics::min_align_of::<T>()
20 }
21
22 // EMIT_MIR lower_intrinsics.forget.LowerIntrinsics.diff
23 pub fn forget<T>(t: T) {
24     core::intrinsics::forget(t)
25 }
26
27 // EMIT_MIR lower_intrinsics.unreachable.LowerIntrinsics.diff
28 pub fn unreachable() -> ! {
29     unsafe { core::intrinsics::unreachable() };
30 }
31
32 // EMIT_MIR lower_intrinsics.f_unit.PreCodegen.before.mir
33 pub fn f_unit() {
34     f_dispatch(());
35 }
36
37
38 // EMIT_MIR lower_intrinsics.f_u64.PreCodegen.before.mir
39 pub fn f_u64() {
40     f_dispatch(0u64);
41 }
42
43 #[inline(always)]
44 pub fn f_dispatch<T>(t: T) {
45     if std::mem::size_of::<T>() == 0 {
46         f_zst(t);
47     } else {
48         f_non_zst(t);
49     }
50 }
51
52 #[inline(never)]
53 pub fn f_zst<T>(_t: T) {
54 }
55
56 #[inline(never)]
57 pub fn f_non_zst<T>(_t: T) {}
58
59 // EMIT_MIR lower_intrinsics.non_const.LowerIntrinsics.diff
60 pub fn non_const<T>() -> usize {
61     // Check that lowering works with non-const operand as a func.
62     let size_of_t = core::intrinsics::size_of::<T>;
63     size_of_t()
64 }
65
66 pub enum E {
67     A,
68     B,
69     C,
70 }
71
72 // EMIT_MIR lower_intrinsics.discriminant.LowerIntrinsics.diff
73 pub fn discriminant<T>(t: T) {
74     core::intrinsics::discriminant_value(&t);
75     core::intrinsics::discriminant_value(&0);
76     core::intrinsics::discriminant_value(&());
77     core::intrinsics::discriminant_value(&E::B);
78 }