1 //===----------------------------------------------------------------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 // UNSUPPORTED: c++03, c++11, c++14, c++17
12 // constexpr int rotr(T x, unsigned int s) noexcept;
14 // Constraints: T is an unsigned integer type
20 #include <type_traits>
22 #include "test_macros.h"
25 enum E1
: unsigned char { rEd
};
26 enum class E2
: unsigned char { red
};
31 ASSERT_SAME_TYPE(decltype(std::rotr(T(), 0)), T
);
32 ASSERT_NOEXCEPT(std::rotr(T(), 0));
33 T max
= std::numeric_limits
<T
>::max();
34 T highbit
= std::rotr(T(1), 1);
36 assert(std::rotr(T(max
- 1), 0) == T(max
- 1));
37 assert(std::rotr(T(max
- 1), 1) == T(max
- highbit
));
38 assert(std::rotr(T(max
- 1), 2) == T(max
- (highbit
>> 1)));
39 assert(std::rotr(T(max
- 1), 3) == T(max
- (highbit
>> 2)));
40 assert(std::rotr(T(max
- 1), 4) == T(max
- (highbit
>> 3)));
41 assert(std::rotr(T(max
- 1), 5) == T(max
- (highbit
>> 4)));
42 assert(std::rotr(T(max
- 1), 6) == T(max
- (highbit
>> 5)));
43 assert(std::rotr(T(max
- 1), 7) == T(max
- (highbit
>> 6)));
45 assert(std::rotr(T(max
- 1), -1) == T(max
- 2));
46 assert(std::rotr(T(max
- 1), -2) == T(max
- 4));
47 assert(std::rotr(T(max
- 1), -3) == T(max
- 8));
48 assert(std::rotr(T(max
- 1), -4) == T(max
- 16));
49 assert(std::rotr(T(max
- 1), -5) == T(max
- 32));
50 assert(std::rotr(T(max
- 1), -6) == T(max
- 64));
51 assert(std::rotr(T(max
- 1), -7) == T(max
- 128));
53 assert(std::rotr(T(128), 0) == T(128));
54 assert(std::rotr(T(128), 1) == T(64));
55 assert(std::rotr(T(128), 2) == T(32));
56 assert(std::rotr(T(128), 3) == T(16));
57 assert(std::rotr(T(128), 4) == T(8));
58 assert(std::rotr(T(128), 5) == T(4));
59 assert(std::rotr(T(128), 6) == T(2));
60 assert(std::rotr(T(128), 7) == T(1));
62 assert(std::rotr(T(1), -1) == T(2));
63 assert(std::rotr(T(1), -2) == T(4));
64 assert(std::rotr(T(1), -3) == T(8));
65 assert(std::rotr(T(1), -4) == T(16));
66 assert(std::rotr(T(1), -5) == T(32));
67 assert(std::rotr(T(1), -6) == T(64));
68 assert(std::rotr(T(1), -7) == T(128));
70 #ifndef TEST_HAS_NO_INT128
71 if constexpr (std::is_same_v
<T
, __uint128_t
>) {
72 T val
= (T(1) << 63) | (T(1) << 64);
73 assert(std::rotr(val
, 0) == val
);
74 assert(std::rotr(val
, 128) == val
);
75 assert(std::rotr(val
, 256) == val
);
76 assert(std::rotr(val
, 1) == val
>> 1);
77 assert(std::rotr(val
, 127) == val
<< 1);
78 assert(std::rotr(T(3), 1) == ((T(1) << 127) | T(1)));
80 assert(std::rotr(val
, -128) == val
);
81 assert(std::rotr(val
, -256) == val
);
82 assert(std::rotr(val
, -1) == val
<< 1);
83 assert(std::rotr(val
, -127) == val
>> 1);
84 assert(std::rotr(T(3), -127) == ((T(1) << 127) | T(1)));
94 auto lambda
= [](auto x
) -> decltype(std::rotl(x
, 1U)) {};
95 using L
= decltype(lambda
);
97 static_assert(!std::is_invocable_v
<L
, signed char>);
98 static_assert(!std::is_invocable_v
<L
, short>);
99 static_assert(!std::is_invocable_v
<L
, int>);
100 static_assert(!std::is_invocable_v
<L
, long>);
101 static_assert(!std::is_invocable_v
<L
, long long>);
102 #ifndef TEST_HAS_NO_INT128
103 static_assert(!std::is_invocable_v
<L
, __int128_t
>);
106 static_assert(!std::is_invocable_v
<L
, std::int8_t>);
107 static_assert(!std::is_invocable_v
<L
, std::int16_t>);
108 static_assert(!std::is_invocable_v
<L
, std::int32_t>);
109 static_assert(!std::is_invocable_v
<L
, std::int64_t>);
110 static_assert(!std::is_invocable_v
<L
, std::intmax_t>);
111 static_assert(!std::is_invocable_v
<L
, std::intptr_t>);
112 static_assert(!std::is_invocable_v
<L
, std::ptrdiff_t>);
114 static_assert(!std::is_invocable_v
<L
, bool>);
115 static_assert(!std::is_invocable_v
<L
, char>);
116 static_assert(!std::is_invocable_v
<L
, wchar_t>);
117 #ifndef TEST_HAS_NO_CHAR8_T
118 static_assert(!std::is_invocable_v
<L
, char8_t
>);
120 static_assert(!std::is_invocable_v
<L
, char16_t
>);
121 static_assert(!std::is_invocable_v
<L
, char32_t
>);
123 static_assert(!std::is_invocable_v
<L
, A
>);
124 static_assert(!std::is_invocable_v
<L
, A
*>);
125 static_assert(!std::is_invocable_v
<L
, E1
>);
126 static_assert(!std::is_invocable_v
<L
, E2
>);
129 static_assert(test
<unsigned char>());
130 static_assert(test
<unsigned short>());
131 static_assert(test
<unsigned int>());
132 static_assert(test
<unsigned long>());
133 static_assert(test
<unsigned long long>());
134 #ifndef TEST_HAS_NO_INT128
135 static_assert(test
<__uint128_t
>());
138 static_assert(test
<std::uint8_t>());
139 static_assert(test
<std::uint16_t>());
140 static_assert(test
<std::uint32_t>());
141 static_assert(test
<std::uint64_t>());
142 static_assert(test
<std::uintmax_t>());
143 static_assert(test
<std::uintptr_t>());
144 static_assert(test
<std::size_t>());
146 test
<unsigned char>();
147 test
<unsigned short>();
148 test
<unsigned int>();
149 test
<unsigned long>();
150 test
<unsigned long long>();
151 #ifndef TEST_HAS_NO_INT128
155 test
<std::uint8_t>();
156 test
<std::uint16_t>();
157 test
<std::uint32_t>();
158 test
<std::uint64_t>();
159 test
<std::uintmax_t>();
160 test
<std::uintptr_t>();