summaryrefslogtreecommitdiffstats
path: root/src/test/mir-opt/lower_intrinsics.rs
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/test/mir-opt/lower_intrinsics.rs78
1 files changed, 78 insertions, 0 deletions
diff --git a/src/test/mir-opt/lower_intrinsics.rs b/src/test/mir-opt/lower_intrinsics.rs
new file mode 100644
index 000000000..eab51b65f
--- /dev/null
+++ b/src/test/mir-opt/lower_intrinsics.rs
@@ -0,0 +1,78 @@
+// compile-flags: -Cpanic=abort
+#![feature(core_intrinsics)]
+#![crate_type = "lib"]
+
+// EMIT_MIR lower_intrinsics.wrapping.LowerIntrinsics.diff
+pub fn wrapping(a: i32, b: i32) {
+ 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>()
+}
+
+// EMIT_MIR lower_intrinsics.align_of.LowerIntrinsics.diff
+pub fn align_of<T>() -> usize {
+ core::intrinsics::min_align_of::<T>()
+}
+
+// EMIT_MIR lower_intrinsics.forget.LowerIntrinsics.diff
+pub fn forget<T>(t: T) {
+ core::intrinsics::forget(t)
+}
+
+// EMIT_MIR lower_intrinsics.unreachable.LowerIntrinsics.diff
+pub fn unreachable() -> ! {
+ unsafe { core::intrinsics::unreachable() };
+}
+
+// EMIT_MIR lower_intrinsics.f_unit.PreCodegen.before.mir
+pub fn f_unit() {
+ f_dispatch(());
+}
+
+
+// EMIT_MIR lower_intrinsics.f_u64.PreCodegen.before.mir
+pub fn f_u64() {
+ f_dispatch(0u64);
+}
+
+#[inline(always)]
+pub fn f_dispatch<T>(t: T) {
+ if std::mem::size_of::<T>() == 0 {
+ f_zst(t);
+ } else {
+ f_non_zst(t);
+ }
+}
+
+#[inline(never)]
+pub fn f_zst<T>(_t: T) {
+}
+
+#[inline(never)]
+pub fn f_non_zst<T>(_t: T) {}
+
+// 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()
+}
+
+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);
+}