2022-08-20 23:47:53 -05:00
|
|
|
// unit-test: LowerIntrinsics
|
|
|
|
// ignore-wasm32 compiled with panic=abort by default
|
|
|
|
|
2022-06-30 03:16:05 -05:00
|
|
|
#![feature(core_intrinsics, intrinsics)]
|
2020-11-13 18:00:00 -06:00
|
|
|
#![crate_type = "lib"]
|
|
|
|
|
|
|
|
// EMIT_MIR lower_intrinsics.wrapping.LowerIntrinsics.diff
|
2022-03-24 21:30:23 -05:00
|
|
|
pub fn wrapping(a: i32, b: i32) {
|
2020-11-13 18:00:00 -06:00
|
|
|
let _x = core::intrinsics::wrapping_add(a, b);
|
|
|
|
let _y = core::intrinsics::wrapping_sub(a, b);
|
|
|
|
let _z = core::intrinsics::wrapping_mul(a, b);
|
|
|
|
}
|
|
|
|
|
|
|
|
// EMIT_MIR lower_intrinsics.size_of.LowerIntrinsics.diff
|
|
|
|
pub fn size_of<T>() -> usize {
|
|
|
|
core::intrinsics::size_of::<T>()
|
|
|
|
}
|
|
|
|
|
2021-09-10 18:54:10 -05:00
|
|
|
// EMIT_MIR lower_intrinsics.align_of.LowerIntrinsics.diff
|
|
|
|
pub fn align_of<T>() -> usize {
|
|
|
|
core::intrinsics::min_align_of::<T>()
|
|
|
|
}
|
|
|
|
|
2020-11-13 18:00:00 -06:00
|
|
|
// EMIT_MIR lower_intrinsics.forget.LowerIntrinsics.diff
|
|
|
|
pub fn forget<T>(t: T) {
|
2020-12-28 18:00:00 -06:00
|
|
|
core::intrinsics::forget(t)
|
2020-11-13 18:00:00 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
// EMIT_MIR lower_intrinsics.unreachable.LowerIntrinsics.diff
|
|
|
|
pub fn unreachable() -> ! {
|
|
|
|
unsafe { core::intrinsics::unreachable() };
|
|
|
|
}
|
|
|
|
|
2020-11-15 18:00:00 -06:00
|
|
|
// EMIT_MIR lower_intrinsics.non_const.LowerIntrinsics.diff
|
|
|
|
pub fn non_const<T>() -> usize {
|
|
|
|
// Check that lowering works with non-const operand as a func.
|
|
|
|
let size_of_t = core::intrinsics::size_of::<T>;
|
|
|
|
size_of_t()
|
|
|
|
}
|
2020-12-10 18:00:00 -06:00
|
|
|
|
|
|
|
pub enum E {
|
|
|
|
A,
|
|
|
|
B,
|
|
|
|
C,
|
|
|
|
}
|
|
|
|
|
|
|
|
// EMIT_MIR lower_intrinsics.discriminant.LowerIntrinsics.diff
|
|
|
|
pub fn discriminant<T>(t: T) {
|
|
|
|
core::intrinsics::discriminant_value(&t);
|
|
|
|
core::intrinsics::discriminant_value(&0);
|
|
|
|
core::intrinsics::discriminant_value(&());
|
|
|
|
core::intrinsics::discriminant_value(&E::B);
|
|
|
|
}
|
2022-06-30 03:16:05 -05:00
|
|
|
|
|
|
|
extern "rust-intrinsic" {
|
|
|
|
// Cannot use `std::intrinsics::copy_nonoverlapping` as that is a wrapper function
|
|
|
|
fn copy_nonoverlapping<T>(src: *const T, dst: *mut T, count: usize);
|
|
|
|
}
|
|
|
|
|
|
|
|
// EMIT_MIR lower_intrinsics.f_copy_nonoverlapping.LowerIntrinsics.diff
|
|
|
|
pub fn f_copy_nonoverlapping() {
|
|
|
|
let src = ();
|
|
|
|
let mut dst = ();
|
|
|
|
unsafe {
|
|
|
|
copy_nonoverlapping(&src as *const _ as *const i32, &mut dst as *mut _ as *mut i32, 0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// EMIT_MIR lower_intrinsics.assume.LowerIntrinsics.diff
|
|
|
|
pub fn assume() {
|
|
|
|
unsafe {
|
|
|
|
std::intrinsics::assume(true);
|
|
|
|
}
|
|
|
|
}
|