]> git.proxmox.com Git - rustc.git/blame - src/test/mir-opt/lower_intrinsics.rs
Merge tag 'debian/1.52.1+dfsg1-1_exp2' into proxmox/buster
[rustc.git] / src / test / mir-opt / lower_intrinsics.rs
CommitLineData
fc512014
XL
1// compile-flags: -Cpanic=abort
2#![feature(core_intrinsics)]
3#![crate_type = "lib"]
4
5// EMIT_MIR lower_intrinsics.wrapping.LowerIntrinsics.diff
6pub 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
13pub fn size_of<T>() -> usize {
14 core::intrinsics::size_of::<T>()
15}
16
17// EMIT_MIR lower_intrinsics.forget.LowerIntrinsics.diff
18pub fn forget<T>(t: T) {
5869c6ff 19 core::intrinsics::forget(t)
fc512014
XL
20}
21
22// EMIT_MIR lower_intrinsics.unreachable.LowerIntrinsics.diff
23pub fn unreachable() -> ! {
24 unsafe { core::intrinsics::unreachable() };
25}
26
27// EMIT_MIR lower_intrinsics.f_unit.PreCodegen.before.mir
28pub fn f_unit() {
29 f_dispatch(());
30}
31
32
33// EMIT_MIR lower_intrinsics.f_u64.PreCodegen.before.mir
34pub fn f_u64() {
35 f_dispatch(0u64);
36}
37
38#[inline(always)]
39pub 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)]
48pub fn f_zst<T>(_t: T) {
49}
50
51#[inline(never)]
52pub fn f_non_zst<T>(_t: T) {}
53
54// EMIT_MIR lower_intrinsics.non_const.LowerIntrinsics.diff
55pub 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
61pub enum E {
62 A,
63 B,
64 C,
65}
66
67// EMIT_MIR lower_intrinsics.discriminant.LowerIntrinsics.diff
68pub 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}