1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
// { dg-additional-options "-w" }
#![feature(intrinsics)]
#[lang = "sized"]
pub trait Sized {}
mod intrinsics {
extern "rust-intrinsic" {
pub fn wrapping_add<T>(a: T, b: T) -> T;
pub fn rotate_left<T>(a: T, b: T) -> T;
pub fn rotate_right<T>(a: T, b: T) -> T;
pub fn offset<T>(ptr: *const T, count: isize) -> *const T;
}
}
mod mem {
extern "rust-intrinsic" {
#[rustc_const_stable(feature = "const_transmute", since = "1.46.0")]
pub fn transmute<T, U>(_: T) -> U;
pub fn size_of<T>() -> usize;
}
}
macro_rules! impl_uint {
($($ty:ident = $lang:literal),*) => {
$(
impl $ty {
pub fn wrapping_add(self, rhs: Self) -> Self {
// intrinsics::wrapping_add(self, rhs)
self + rhs
}
pub fn rotate_left(self, n: u32) -> Self {
unsafe {
intrinsics::rotate_left(self, n as Self)
}
}
pub fn rotate_right(self, n: u32) -> Self {
unsafe {
intrinsics::rotate_right(self, n as Self)
}
}
pub fn to_le(self) -> Self {
{
self
}
}
pub const fn from_le_bytes(bytes: [u8; mem::size_of::<Self>()]) -> Self {
// { dg-error "only functions marked as .const. are allowed to be called from constant contexts" "" { target *-*-* } .-1 }
Self::from_le(Self::from_ne_bytes(bytes))
}
pub const fn from_le(x: Self) -> Self {
#[cfg(target_endian = "little")]
{
x
}
}
pub const fn from_ne_bytes(bytes: [u8; mem::size_of::<Self>()]) -> Self {
// { dg-error "only functions marked as .const. are allowed to be called from constant contexts" "" { target *-*-* } .-1 }
unsafe { mem::transmute(bytes) }
}
}
)*
}
}
impl_uint!(
u8 = "u8",
u16 = "u16",
u32 = "u32",
u64 = "u64",
u128 = "u128",
usize = "usize"
);
|