/src/test/mir-opt/lower_intrinsics.rs

https://gitlab.com/rust-lang/rust · Rust · 78 lines · 53 code · 14 blank · 11 comment · 3 complexity · 7f49f1670615b51af05e9e764aaf4492 MD5 · raw file

  1. // compile-flags: -Cpanic=abort
  2. #![feature(core_intrinsics)]
  3. #![crate_type = "lib"]
  4. // EMIT_MIR lower_intrinsics.wrapping.LowerIntrinsics.diff
  5. pub fn wrapping(a: i32, b: i32) {
  6. let _x = core::intrinsics::wrapping_add(a, b);
  7. let _y = core::intrinsics::wrapping_sub(a, b);
  8. let _z = core::intrinsics::wrapping_mul(a, b);
  9. }
  10. // EMIT_MIR lower_intrinsics.size_of.LowerIntrinsics.diff
  11. pub fn size_of<T>() -> usize {
  12. core::intrinsics::size_of::<T>()
  13. }
  14. // EMIT_MIR lower_intrinsics.align_of.LowerIntrinsics.diff
  15. pub fn align_of<T>() -> usize {
  16. core::intrinsics::min_align_of::<T>()
  17. }
  18. // EMIT_MIR lower_intrinsics.forget.LowerIntrinsics.diff
  19. pub fn forget<T>(t: T) {
  20. core::intrinsics::forget(t)
  21. }
  22. // EMIT_MIR lower_intrinsics.unreachable.LowerIntrinsics.diff
  23. pub fn unreachable() -> ! {
  24. unsafe { core::intrinsics::unreachable() };
  25. }
  26. // EMIT_MIR lower_intrinsics.f_unit.PreCodegen.before.mir
  27. pub fn f_unit() {
  28. f_dispatch(());
  29. }
  30. // EMIT_MIR lower_intrinsics.f_u64.PreCodegen.before.mir
  31. pub fn f_u64() {
  32. f_dispatch(0u64);
  33. }
  34. #[inline(always)]
  35. pub fn f_dispatch<T>(t: T) {
  36. if std::mem::size_of::<T>() == 0 {
  37. f_zst(t);
  38. } else {
  39. f_non_zst(t);
  40. }
  41. }
  42. #[inline(never)]
  43. pub fn f_zst<T>(_t: T) {
  44. }
  45. #[inline(never)]
  46. pub fn f_non_zst<T>(_t: T) {}
  47. // EMIT_MIR lower_intrinsics.non_const.LowerIntrinsics.diff
  48. pub fn non_const<T>() -> usize {
  49. // Check that lowering works with non-const operand as a func.
  50. let size_of_t = core::intrinsics::size_of::<T>;
  51. size_of_t()
  52. }
  53. pub enum E {
  54. A,
  55. B,
  56. C,
  57. }
  58. // EMIT_MIR lower_intrinsics.discriminant.LowerIntrinsics.diff
  59. pub fn discriminant<T>(t: T) {
  60. core::intrinsics::discriminant_value(&t);
  61. core::intrinsics::discriminant_value(&0);
  62. core::intrinsics::discriminant_value(&());
  63. core::intrinsics::discriminant_value(&E::B);
  64. }