]> git.lizzy.rs Git - rust.git/blob - tests/mir-opt/lower_intrinsics.rs
Rollup merge of #105526 - Xiretza:iter-from-generator-derive, r=scottmcm
[rust.git] / tests / mir-opt / lower_intrinsics.rs
1 // unit-test: LowerIntrinsics
2 // ignore-wasm32 compiled with panic=abort by default
3
4 #![feature(core_intrinsics, intrinsics)]
5 #![crate_type = "lib"]
6
7 // EMIT_MIR lower_intrinsics.wrapping.LowerIntrinsics.diff
8 pub fn wrapping(a: i32, b: i32) {
9     let _x = core::intrinsics::wrapping_add(a, b);
10     let _y = core::intrinsics::wrapping_sub(a, b);
11     let _z = core::intrinsics::wrapping_mul(a, b);
12 }
13
14 // EMIT_MIR lower_intrinsics.size_of.LowerIntrinsics.diff
15 pub fn size_of<T>() -> usize {
16     core::intrinsics::size_of::<T>()
17 }
18
19 // EMIT_MIR lower_intrinsics.align_of.LowerIntrinsics.diff
20 pub fn align_of<T>() -> usize {
21     core::intrinsics::min_align_of::<T>()
22 }
23
24 // EMIT_MIR lower_intrinsics.forget.LowerIntrinsics.diff
25 pub fn forget<T>(t: T) {
26     core::intrinsics::forget(t)
27 }
28
29 // EMIT_MIR lower_intrinsics.unreachable.LowerIntrinsics.diff
30 pub fn unreachable() -> ! {
31     unsafe { core::intrinsics::unreachable() };
32 }
33
34 // EMIT_MIR lower_intrinsics.non_const.LowerIntrinsics.diff
35 pub fn non_const<T>() -> usize {
36     // Check that lowering works with non-const operand as a func.
37     let size_of_t = core::intrinsics::size_of::<T>;
38     size_of_t()
39 }
40
41 pub enum E {
42     A,
43     B,
44     C,
45 }
46
47 // EMIT_MIR lower_intrinsics.discriminant.LowerIntrinsics.diff
48 pub fn discriminant<T>(t: T) {
49     core::intrinsics::discriminant_value(&t);
50     core::intrinsics::discriminant_value(&0);
51     core::intrinsics::discriminant_value(&());
52     core::intrinsics::discriminant_value(&E::B);
53 }
54
55 extern "rust-intrinsic" {
56     // Cannot use `std::intrinsics::copy_nonoverlapping` as that is a wrapper function
57     fn copy_nonoverlapping<T>(src: *const T, dst: *mut T, count: usize);
58 }
59
60 // EMIT_MIR lower_intrinsics.f_copy_nonoverlapping.LowerIntrinsics.diff
61 pub fn f_copy_nonoverlapping() {
62     let src = ();
63     let mut dst = ();
64     unsafe {
65         copy_nonoverlapping(&src as *const _ as *const i32, &mut dst as *mut _ as *mut i32, 0);
66     }
67 }
68
69 // EMIT_MIR lower_intrinsics.assume.LowerIntrinsics.diff
70 pub fn assume() {
71     unsafe {
72         std::intrinsics::assume(true);
73     }
74 }