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, c++20, c++23
13 // template<class R, class T>
14 // constexpr R saturate_cast(T x) noexcept; // freestanding
22 #include "test_macros.h"
26 static_assert(noexcept(std::saturate_cast
<signed int>(std::numeric_limits
<signed char>::max())));
27 static_assert(noexcept(std::saturate_cast
<signed int>(std::numeric_limits
<unsigned char>::max())));
29 static_assert(noexcept(std::saturate_cast
<unsigned int>(std::numeric_limits
<signed char>::max())));
30 static_assert(noexcept(std::saturate_cast
<unsigned int>(std::numeric_limits
<unsigned char>::max())));
33 static_assert(noexcept(std::saturate_cast
<signed long int>(std::numeric_limits
<signed long int>::max())));
34 static_assert(noexcept(std::saturate_cast
<unsigned long int>(std::numeric_limits
<unsigned long int>::max())));
37 static_assert(noexcept(std::saturate_cast
<signed char>(std::numeric_limits
<signed int>::max())));
38 static_assert(noexcept(std::saturate_cast
<signed char>(std::numeric_limits
<unsigned int>::max())));
40 static_assert(noexcept(std::saturate_cast
<unsigned char>(std::numeric_limits
<signed int>::max())));
41 static_assert(noexcept(std::saturate_cast
<unsigned char>(std::numeric_limits
<unsigned int>::max())));
45 constexpr bool test() {
48 #ifndef TEST_HAS_NO_INT128
49 using SIntT
= __int128_t
;
50 using UIntT
= __uint128_t
;
52 using SIntT
= long long int;
53 using UIntT
= unsigned long long int;
56 // Constants the values of which depend on the context (platform)
58 constexpr auto sBigMin
= std::numeric_limits
<SIntT
>::min();
59 constexpr auto sZero
= SIntT
{0};
60 constexpr auto sBigMax
= std::numeric_limits
<SIntT
>::max();
62 constexpr auto uZero
= UIntT
{0};
63 constexpr auto uBigMax
= std::numeric_limits
<UIntT
>::max();
65 // Constants to avoid casting in place
67 constexpr auto O_C
= static_cast<signed char>(0);
68 constexpr auto O_UC
= static_cast<unsigned char>(0);
70 constexpr auto O_S
= static_cast<signed short int>(0);
71 constexpr auto O_US
= static_cast<unsigned short int>(0);
75 // TODO(LLVM-20) remove [[maybe_unused]] and `{}` scope since all supported compilers support "Placeholder variables with no name",
77 { [[maybe_unused
]] std::same_as
<signed char> decltype(auto) _
= std::saturate_cast
<signed char>(SCHAR_MAX
); }
78 assert(std::saturate_cast
<signed char>(SCHAR_MIN
) == SCHAR_MIN
);
79 assert(std::saturate_cast
<signed char>( O_C
) == O_C
);
80 assert(std::saturate_cast
<signed char>(SCHAR_MAX
) == SCHAR_MAX
);
82 { [[maybe_unused
]] std::same_as
<signed char> decltype(auto) _
= std::saturate_cast
<signed char>(UCHAR_MAX
); }
83 assert(std::saturate_cast
<signed char>( O_UC
) == O_C
);
84 assert(std::saturate_cast
<signed char>(UCHAR_MAX
) == SCHAR_MAX
);
86 { [[maybe_unused
]] std::same_as
<signed char> decltype(auto) _
= std::saturate_cast
<signed char>(sBigMax
); }
87 assert(std::saturate_cast
<signed char>(sBigMin
) == SCHAR_MIN
); // saturated
88 assert(std::saturate_cast
<signed char>( sZero
) == O_C
);
89 assert(std::saturate_cast
<signed char>(sBigMax
) == SCHAR_MAX
); // saturated
91 { [[maybe_unused
]] std::same_as
<signed char> decltype(auto) _
= std::saturate_cast
<signed char>(uBigMax
); }
92 assert(std::saturate_cast
<signed char>( uZero
) == O_C
);
93 assert(std::saturate_cast
<signed char>(uBigMax
) == SCHAR_MAX
); // saturated
97 { [[maybe_unused
]] std::same_as
<signed short int> decltype(auto) _
= std::saturate_cast
<signed short int>(SCHAR_MAX
); }
98 assert(std::saturate_cast
<signed short int>(SCHAR_MIN
) == static_cast<signed short int>(SCHAR_MIN
));
99 assert(std::saturate_cast
<signed short int>( O_C
) == O_S
);
100 assert(std::saturate_cast
<signed short int>(SCHAR_MAX
) == static_cast<signed short int>(SCHAR_MAX
));
102 { [[maybe_unused
]] std::same_as
<signed short int> decltype(auto) _
= std::saturate_cast
<signed short int>(UCHAR_MAX
); }
103 assert(std::saturate_cast
<signed short int>( O_UC
) == O_S
);
104 assert(std::saturate_cast
<signed short int>(UCHAR_MAX
) == static_cast<signed short int>(UCHAR_MAX
));
106 { [[maybe_unused
]] std::same_as
<signed short int> decltype(auto) _
= std::saturate_cast
<signed short int>(SHRT_MAX
); }
107 assert(std::saturate_cast
<signed short int>( SHRT_MIN
) == SHRT_MIN
);
108 assert(std::saturate_cast
<signed short int>( O_S
) == O_S
);
109 assert(std::saturate_cast
<signed short int>( SHRT_MAX
) == SHRT_MAX
);
111 { [[maybe_unused
]] std::same_as
<signed short int> decltype(auto) _
= std::saturate_cast
<signed short int>(USHRT_MAX
); }
112 assert(std::saturate_cast
<signed short int>( O_US
) == O_S
);
113 assert(std::saturate_cast
<signed short int>(USHRT_MAX
) == SHRT_MAX
); // saturated
115 { [[maybe_unused
]] std::same_as
<signed short int> decltype(auto) _
= std::saturate_cast
<signed short int>(sBigMax
); }
116 assert(std::saturate_cast
<signed short int>( sBigMin
) == SHRT_MIN
); // saturated
117 assert(std::saturate_cast
<signed short int>( sZero
) == O_S
);
118 assert(std::saturate_cast
<signed short int>( sBigMax
) == SHRT_MAX
); // saturated
120 { [[maybe_unused
]] std::same_as
<signed short int> decltype(auto) _
= std::saturate_cast
<signed short int>(uBigMax
); }
121 assert(std::saturate_cast
<signed short int>( uZero
) == O_S
);
122 assert(std::saturate_cast
<signed short int>( uBigMax
) == SHRT_MAX
); // saturated
126 { [[maybe_unused
]] std::same_as
<signed int> decltype(auto) _
= std::saturate_cast
<signed int>(SCHAR_MAX
); }
127 assert(std::saturate_cast
<signed int>(SCHAR_MIN
) == static_cast<signed int>(SCHAR_MIN
));
128 assert(std::saturate_cast
<signed int>( O_C
) == 0);
129 assert(std::saturate_cast
<signed int>(SCHAR_MAX
) == static_cast<signed int>(SCHAR_MAX
));
131 { [[maybe_unused
]] std::same_as
<signed int> decltype(auto) _
= std::saturate_cast
<signed int>(UCHAR_MAX
); }
132 assert(std::saturate_cast
<signed int>( O_UC
) == 0);
133 assert(std::saturate_cast
<signed int>(UCHAR_MAX
) == static_cast<signed int>(UCHAR_MAX
));
135 { [[maybe_unused
]] std::same_as
<signed int> decltype(auto) _
= std::saturate_cast
<signed int>(INT_MAX
); }
136 assert(std::saturate_cast
<signed int>( INT_MIN
) == INT_MIN
);
137 assert(std::saturate_cast
<signed int>( 0) == 0);
138 assert(std::saturate_cast
<signed int>( INT_MAX
) == INT_MAX
);
140 { [[maybe_unused
]] std::same_as
<signed int> decltype(auto) _
= std::saturate_cast
<signed int>(UINT_MAX
); }
141 assert(std::saturate_cast
<signed int>( 0) == 0);
142 assert(std::saturate_cast
<signed int>(UINT_MAX
) == INT_MAX
); // saturated
144 { [[maybe_unused
]] std::same_as
<signed int> decltype(auto) _
= std::saturate_cast
<signed int>(sBigMax
); }
145 assert(std::saturate_cast
<signed int>( sBigMin
) == INT_MIN
); // saturated
146 assert(std::saturate_cast
<signed int>( sZero
) == 0);
147 assert(std::saturate_cast
<signed int>( sBigMax
) == INT_MAX
); // saturated
149 { [[maybe_unused
]] std::same_as
<signed int> decltype(auto) _
= std::saturate_cast
<signed int>(uBigMax
); }
150 assert(std::saturate_cast
<signed int>( uZero
) == 0);
151 assert(std::saturate_cast
<signed int>( uBigMax
) == INT_MAX
); // saturated
155 { [[maybe_unused
]] std::same_as
<signed long int> decltype(auto) _
= std::saturate_cast
<signed long int>(SCHAR_MAX
); }
156 assert(std::saturate_cast
<signed long int>(SCHAR_MIN
) == static_cast<signed long int>(SCHAR_MIN
));
157 assert(std::saturate_cast
<signed long int>( O_C
) == 0L);
158 assert(std::saturate_cast
<signed long int>(SCHAR_MAX
) == static_cast<signed long int>(SCHAR_MAX
));
160 { [[maybe_unused
]] std::same_as
<signed long int> decltype(auto) _
= std::saturate_cast
<signed long int>(UCHAR_MAX
); }
161 assert(std::saturate_cast
<signed long int>( O_UC
) == 0L);
162 assert(std::saturate_cast
<signed long int>(UCHAR_MAX
) == static_cast<signed long int>(UCHAR_MAX
));
164 { [[maybe_unused
]] std::same_as
<signed long int> decltype(auto) _
= std::saturate_cast
<signed long int>(LONG_MAX
); }
165 assert(std::saturate_cast
<signed long int>( LONG_MIN
) == LONG_MIN
);
166 assert(std::saturate_cast
<signed long int>( 0L) == 0L);
167 assert(std::saturate_cast
<signed long int>( LONG_MAX
) == LONG_MAX
);
169 { [[maybe_unused
]] std::same_as
<signed long int> decltype(auto) _
= std::saturate_cast
<signed long int>(ULONG_MAX
); }
170 assert(std::saturate_cast
<signed long int>( 0UL) == 0L);
171 assert(std::saturate_cast
<signed long int>(ULONG_MAX
) == LONG_MAX
); // saturated
173 { [[maybe_unused
]] std::same_as
<signed long int> decltype(auto) _
= std::saturate_cast
<signed long int>(sBigMax
); }
174 assert(std::saturate_cast
<signed long int>( sBigMin
) == LONG_MIN
); // saturated
175 assert(std::saturate_cast
<signed long int>( sZero
) == 0L);
176 assert(std::saturate_cast
<signed long int>( sBigMax
) == LONG_MAX
); // saturated
178 { [[maybe_unused
]] std::same_as
<signed long int> decltype(auto) _
= std::saturate_cast
<signed long int>(uBigMax
); }
179 assert(std::saturate_cast
<signed long int>( uZero
) == 0L);
180 assert(std::saturate_cast
<signed long int>( uBigMax
) == LONG_MAX
); // saturated
184 { [[maybe_unused
]] std::same_as
<signed long long int> decltype(auto) _
= std::saturate_cast
<signed long long int>(SCHAR_MAX
); }
185 assert(std::saturate_cast
<signed long long int>(SCHAR_MIN
) == static_cast<signed long long int>(SCHAR_MIN
));
186 assert(std::saturate_cast
<signed long long int>( 0LL) == 0LL);
187 assert(std::saturate_cast
<signed long long int>(SCHAR_MAX
) == static_cast<signed long long int>(SCHAR_MAX
));
189 { [[maybe_unused
]] std::same_as
<signed long long int> decltype(auto) _
= std::saturate_cast
<signed long long int>(UCHAR_MAX
); }
190 assert(std::saturate_cast
<signed long long int>( O_UC
) == 0LL);
191 assert(std::saturate_cast
<signed long long int>(UCHAR_MAX
) == static_cast<signed long long int>(UCHAR_MAX
));
193 { [[maybe_unused
]] std::same_as
<signed long long int> decltype(auto) _
= std::saturate_cast
<signed long long int>(LLONG_MIN
); }
194 assert(std::saturate_cast
<signed long long int>(LLONG_MIN
) == LLONG_MIN
);
195 assert(std::saturate_cast
<signed long long int>( 0LL) == 0LL);
196 assert(std::saturate_cast
<signed long long int>(LLONG_MAX
) == LLONG_MAX
);
198 { [[maybe_unused
]] std::same_as
<signed long long int> decltype(auto) _
= std::saturate_cast
<signed long long int>(ULLONG_MAX
); }
199 assert(std::saturate_cast
<signed long long int>( 0ULL) == 0LL);
200 assert(std::saturate_cast
<signed long long int>(ULLONG_MAX
) == LLONG_MAX
); // saturated
202 #ifndef TEST_HAS_NO_INT128
203 { [[maybe_unused
]] std::same_as
<signed long long int> decltype(auto) _
= std::saturate_cast
<signed long long int>(sBigMax
); }
204 assert(std::saturate_cast
<signed long long int>( sBigMin
) == LLONG_MIN
); // (128-bit) saturated
205 assert(std::saturate_cast
<signed long long int>( sZero
) == 0LL);
206 assert(std::saturate_cast
<signed long long int>( sBigMax
) == LLONG_MAX
); // (128-bit) saturated
208 { [[maybe_unused
]] std::same_as
<signed long long int> decltype(auto) _
= std::saturate_cast
<signed long long int>(uBigMax
); }
209 assert(std::saturate_cast
<signed long long int>( uZero
) == 0LL);
210 assert(std::saturate_cast
<signed long long int>( uBigMax
) == LLONG_MAX
); // (128-bit) saturated
212 { [[maybe_unused
]] std::same_as
<__int128_t
> decltype(auto) _
= std::saturate_cast
<__int128_t
>(SCHAR_MAX
); }
213 assert(std::saturate_cast
<__int128_t
>(SCHAR_MIN
) == static_cast<__int128_t
>(SCHAR_MIN
));
214 assert(std::saturate_cast
<__int128_t
>( O_C
) == sZero
);
215 assert(std::saturate_cast
<__int128_t
>(SCHAR_MAX
) == static_cast<__int128_t
>(SCHAR_MAX
));
217 { [[maybe_unused
]] std::same_as
<__int128_t
> decltype(auto) _
= std::saturate_cast
<__int128_t
>(UCHAR_MAX
); }
218 assert(std::saturate_cast
<__int128_t
>( O_UC
) == sZero
);
219 assert(std::saturate_cast
<__int128_t
>(UCHAR_MAX
) == static_cast<__int128_t
>(UCHAR_MAX
));
221 { [[maybe_unused
]] std::same_as
<__int128_t
> decltype(auto) _
= std::saturate_cast
<__int128_t
>(sBigMax
); }
222 assert(std::saturate_cast
<__int128_t
>( sBigMin
) == sBigMin
);
223 assert(std::saturate_cast
<__int128_t
>( sZero
) == sZero
);
224 assert(std::saturate_cast
<__int128_t
>( sBigMax
) == sBigMax
);
226 { [[maybe_unused
]] std::same_as
<__int128_t
> decltype(auto) _
= std::saturate_cast
<__int128_t
>(uBigMax
); }
227 assert(std::saturate_cast
<__int128_t
>( uZero
) == sZero
);
228 assert(std::saturate_cast
<__int128_t
>( uBigMax
) == sBigMax
); // saturated
233 { [[maybe_unused
]] std::same_as
<unsigned char> decltype(auto) _
= std::saturate_cast
<unsigned char>(SCHAR_MAX
); }
234 assert(std::saturate_cast
<unsigned char>(SCHAR_MIN
) == O_UC
);
235 assert(std::saturate_cast
<unsigned char>( O_C
) == O_UC
);
236 assert(std::saturate_cast
<unsigned char>(SCHAR_MAX
) == static_cast<unsigned char>(SCHAR_MAX
));
238 { [[maybe_unused
]] std::same_as
<unsigned char> decltype(auto) _
= std::saturate_cast
<unsigned char>(UCHAR_MAX
); }
239 assert(std::saturate_cast
<unsigned char>( O_UC
) == O_UC
);
240 assert(std::saturate_cast
<unsigned char>(UCHAR_MAX
) == UCHAR_MAX
);
242 { [[maybe_unused
]] std::same_as
<unsigned char> decltype(auto) _
= std::saturate_cast
<unsigned char>(sBigMax
); }
243 assert(std::saturate_cast
<unsigned char>( sBigMin
) == O_UC
); // saturated
244 assert(std::saturate_cast
<unsigned char>( sZero
) == O_UC
);
245 assert(std::saturate_cast
<unsigned char>( sBigMax
) == UCHAR_MAX
); // saturated
247 { [[maybe_unused
]] std::same_as
<unsigned char> decltype(auto) _
= std::saturate_cast
<unsigned char>(uBigMax
); }
248 assert(std::saturate_cast
<unsigned char>( uZero
) == O_UC
);
249 assert(std::saturate_cast
<unsigned char>( uBigMax
) == UCHAR_MAX
); // saturated
253 { [[maybe_unused
]] std::same_as
<unsigned short int> decltype(auto) _
= std::saturate_cast
<unsigned short int>(SCHAR_MAX
); }
254 assert(std::saturate_cast
<unsigned short int>(SCHAR_MIN
) == O_US
);
255 assert(std::saturate_cast
<unsigned short int>( O_C
) == O_US
);
256 assert(std::saturate_cast
<unsigned short int>(SCHAR_MAX
) == static_cast<unsigned short int>(SCHAR_MAX
));
258 { [[maybe_unused
]] std::same_as
<unsigned short int> decltype(auto) _
= std::saturate_cast
<unsigned short int>(UCHAR_MAX
); }
259 assert(std::saturate_cast
<unsigned short int>( O_UC
) == O_US
);
260 assert(std::saturate_cast
<unsigned short int>(UCHAR_MAX
) == static_cast<unsigned short int>(UCHAR_MAX
));
262 { [[maybe_unused
]] std::same_as
<unsigned short int> decltype(auto) _
= std::saturate_cast
<unsigned short int>(SCHAR_MIN
); }
263 assert(std::saturate_cast
<unsigned short int>( SHRT_MIN
) == O_US
);
264 assert(std::saturate_cast
<unsigned short int>( O_S
) == O_US
);
265 assert(std::saturate_cast
<unsigned short int>( SHRT_MAX
) == static_cast<unsigned short int>(SHRT_MAX
));
267 { [[maybe_unused
]] std::same_as
<unsigned short int> decltype(auto) _
= std::saturate_cast
<unsigned short int>(UCHAR_MAX
); }
268 assert(std::saturate_cast
<unsigned short int>( O_US
) == O_US
);
269 assert(std::saturate_cast
<unsigned short int>(USHRT_MAX
) == USHRT_MAX
);
271 { [[maybe_unused
]] std::same_as
<unsigned short int> decltype(auto) _
= std::saturate_cast
<unsigned short int>(sBigMax
); }
272 assert(std::saturate_cast
<unsigned short int>( sBigMin
) == O_US
); // saturated
273 assert(std::saturate_cast
<unsigned short int>( sZero
) == O_US
);
274 assert(std::saturate_cast
<unsigned short int>( sBigMax
) == USHRT_MAX
); // saturated
276 { [[maybe_unused
]] std::same_as
<unsigned short int> decltype(auto) _
= std::saturate_cast
<unsigned short int>(uBigMax
); }
277 assert(std::saturate_cast
<unsigned short int>( uZero
) == O_US
);
278 assert(std::saturate_cast
<unsigned short int>( uBigMax
) == USHRT_MAX
); // saturated
282 { [[maybe_unused
]] std::same_as
<unsigned int> decltype(auto) _
= std::saturate_cast
<unsigned int>(SCHAR_MAX
); }
283 assert(std::saturate_cast
<unsigned int>(SCHAR_MIN
) == O_US
);
284 assert(std::saturate_cast
<unsigned int>( O_UC
) == 0U);
285 assert(std::saturate_cast
<unsigned int>(SCHAR_MAX
) == static_cast<unsigned int>(SCHAR_MAX
));
287 { [[maybe_unused
]] std::same_as
<unsigned int> decltype(auto) _
= std::saturate_cast
<unsigned int>(UCHAR_MAX
); }
288 assert(std::saturate_cast
<unsigned int>( O_UC
) == 0U);
289 assert(std::saturate_cast
<unsigned int>(UCHAR_MAX
) == static_cast<unsigned int>(UCHAR_MAX
));
291 { [[maybe_unused
]] std::same_as
<unsigned int> decltype(auto) _
= std::saturate_cast
<unsigned int>(INT_MAX
); }
292 assert(std::saturate_cast
<unsigned int>( INT_MIN
) == 0U);
293 assert(std::saturate_cast
<unsigned int>( 0) == 0U);
294 assert(std::saturate_cast
<unsigned int>( INT_MAX
) == static_cast<unsigned int>(INT_MAX
));
296 { [[maybe_unused
]] std::same_as
<unsigned int> decltype(auto) _
= std::saturate_cast
<unsigned int>(UINT_MAX
); }
297 assert(std::saturate_cast
<unsigned int>( 0U) == 0U);
298 assert(std::saturate_cast
<unsigned int>( UINT_MAX
) == UINT_MAX
);
300 { [[maybe_unused
]] std::same_as
<unsigned int> decltype(auto) _
= std::saturate_cast
<unsigned int>(sBigMax
); }
301 assert(std::saturate_cast
<unsigned int>( sBigMin
) == 0U); // saturated
302 assert(std::saturate_cast
<unsigned int>( sZero
) == 0U);
303 assert(std::saturate_cast
<unsigned int>( sBigMax
) == UINT_MAX
); // saturated
305 { [[maybe_unused
]] std::same_as
<unsigned int> decltype(auto) _
= std::saturate_cast
<unsigned int>(uBigMax
); }
306 assert(std::saturate_cast
<unsigned int>( uZero
) == 0U);
307 assert(std::saturate_cast
<unsigned int>( uBigMax
) == UINT_MAX
); // saturated
311 { [[maybe_unused
]] std::same_as
<unsigned long int> decltype(auto) _
= std::saturate_cast
<unsigned long int>(SCHAR_MAX
); }
312 assert(std::saturate_cast
<unsigned long int>(SCHAR_MIN
) == 0UL);
313 assert(std::saturate_cast
<unsigned long int>( O_C
) == 0UL);
314 assert(std::saturate_cast
<unsigned long int>(SCHAR_MAX
) == static_cast<unsigned long int>(SCHAR_MAX
));
316 { [[maybe_unused
]] std::same_as
<unsigned long int> decltype(auto) _
= std::saturate_cast
<unsigned long int>(UCHAR_MAX
); }
317 assert(std::saturate_cast
<unsigned long int>( O_UC
) == 0UL);
318 assert(std::saturate_cast
<unsigned long int>(UCHAR_MAX
) == static_cast<unsigned long int>(UCHAR_MAX
));
320 { [[maybe_unused
]] std::same_as
<unsigned long int> decltype(auto) _
= std::saturate_cast
<unsigned long int>(LONG_MAX
); }
321 assert(std::saturate_cast
<unsigned long int>( LONG_MIN
) == 0UL);
322 assert(std::saturate_cast
<unsigned long int>( 0L) == 0UL);
323 assert(std::saturate_cast
<unsigned long int>( LONG_MAX
) == static_cast<unsigned long int>(LONG_MAX
));
325 { [[maybe_unused
]] std::same_as
<unsigned long int> decltype(auto) _
= std::saturate_cast
<unsigned long int>(ULONG_MAX
); }
326 assert(std::saturate_cast
<unsigned long int>( 0UL) == 0UL);
327 assert(std::saturate_cast
<unsigned long int>(ULONG_MAX
) == ULONG_MAX
);
329 { [[maybe_unused
]] std::same_as
<unsigned long int> decltype(auto) _
= std::saturate_cast
<unsigned long int>(sBigMax
); }
330 assert(std::saturate_cast
<unsigned long int>( sBigMin
) == 0UL); // saturated
331 assert(std::saturate_cast
<unsigned long int>( sZero
) == 0UL);
332 assert(std::saturate_cast
<unsigned long int>( sBigMax
) == ULONG_MAX
); // saturated
334 { [[maybe_unused
]] std::same_as
<unsigned long int> decltype(auto) _
= std::saturate_cast
<unsigned long int>(uBigMax
); }
335 assert(std::saturate_cast
<unsigned long int>( uZero
) == 0UL);
336 assert(std::saturate_cast
<unsigned long int>( uBigMax
) == ULONG_MAX
); // saturated
338 // unsigned long long
340 { [[maybe_unused
]] std::same_as
<unsigned long long int> decltype(auto) _
= std::saturate_cast
<unsigned long long int>(SCHAR_MAX
); }
341 assert(std::saturate_cast
<unsigned long long int>( SCHAR_MIN
) == 0ULL);
342 assert(std::saturate_cast
<unsigned long long int>( O_C
) == 0ULL);
343 assert(std::saturate_cast
<unsigned long long int>( SCHAR_MAX
) == static_cast<unsigned long long int>(SCHAR_MAX
));
345 { [[maybe_unused
]] std::same_as
<unsigned long long int> decltype(auto) _
= std::saturate_cast
<unsigned long long int>(UCHAR_MAX
); }
346 assert(std::saturate_cast
<unsigned long long int>( O_UC
) == 0ULL);
347 assert(std::saturate_cast
<unsigned long long int>( UCHAR_MAX
) == static_cast<unsigned long long int>(UCHAR_MAX
));
349 { [[maybe_unused
]] std::same_as
<unsigned long long int> decltype(auto) _
= std::saturate_cast
<unsigned long long int>(LLONG_MAX
); }
350 assert(std::saturate_cast
<unsigned long long int>( LLONG_MIN
) == 0ULL);
351 assert(std::saturate_cast
<unsigned long long int>( 0LL) == 0ULL);
352 assert(std::saturate_cast
<unsigned long long int>( LLONG_MAX
) == static_cast<unsigned long long int>(LLONG_MAX
));
354 { [[maybe_unused
]] std::same_as
<unsigned long long int> decltype(auto) _
= std::saturate_cast
<unsigned long long int>(ULLONG_MAX
); }
355 assert(std::saturate_cast
<unsigned long long int>( 0ULL) == 0ULL);
356 assert(std::saturate_cast
<unsigned long long int>(ULLONG_MAX
) == ULLONG_MAX
);
358 #ifndef TEST_HAS_NO_INT128
359 { [[maybe_unused
]] std::same_as
<unsigned long long int> decltype(auto) _
= std::saturate_cast
<unsigned long long int>(sBigMax
); }
360 assert(std::saturate_cast
<unsigned long long int>( sBigMin
) == 0ULL); // (128-bit) saturated
361 assert(std::saturate_cast
<unsigned long long int>( sZero
) == 0ULL);
362 assert(std::saturate_cast
<unsigned long long int>( sBigMax
) == ULLONG_MAX
); // (128-bit) saturated
364 { [[maybe_unused
]] std::same_as
<unsigned long long int> decltype(auto) _
= std::saturate_cast
<unsigned long long int>(uBigMax
); }
365 assert(std::saturate_cast
<unsigned long long int>( uZero
) == 0ULL);
366 assert(std::saturate_cast
<unsigned long long int>( uBigMax
) == ULLONG_MAX
); // (128-bit) saturated
368 { [[maybe_unused
]] std::same_as
<__uint128_t
> decltype(auto) _
= std::saturate_cast
<__uint128_t
>(SCHAR_MIN
); }
369 assert(std::saturate_cast
<__uint128_t
>(SCHAR_MIN
) == uZero
);
370 assert(std::saturate_cast
<__uint128_t
>( O_C
) == uZero
);
371 assert(std::saturate_cast
<__uint128_t
>(SCHAR_MAX
) == static_cast<__uint128_t
>(SCHAR_MAX
));
373 { [[maybe_unused
]] std::same_as
<__uint128_t
> decltype(auto) _
= std::saturate_cast
<__uint128_t
>(UCHAR_MAX
); }
374 assert(std::saturate_cast
<__uint128_t
>( O_UC
) == uZero
);
375 assert(std::saturate_cast
<__uint128_t
>(UCHAR_MAX
) == static_cast<__uint128_t
>(UCHAR_MAX
));
377 { [[maybe_unused
]] std::same_as
<__uint128_t
> decltype(auto) _
= std::saturate_cast
<__uint128_t
>(sBigMax
); }
378 assert(std::saturate_cast
<__uint128_t
>( sBigMin
) == uZero
); // saturated
379 assert(std::saturate_cast
<__uint128_t
>( sZero
) == uZero
);
380 assert(std::saturate_cast
<__uint128_t
>( sBigMax
) == static_cast<__uint128_t
>(sBigMax
));
382 { [[maybe_unused
]] std::same_as
<__uint128_t
> decltype(auto) _
= std::saturate_cast
<__uint128_t
>(uBigMax
); }
383 assert(std::saturate_cast
<__uint128_t
>( uZero
) == uZero
);
384 assert(std::saturate_cast
<__uint128_t
>( uBigMax
) == uBigMax
);
392 int main(int, char**) {
394 static_assert(test());