395 lines · cpp
1//===----------------------------------------------------------------------===//2//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-exception6//7//===----------------------------------------------------------------------===//8 9// REQUIRES: std-at-least-c++2610 11// <numeric>12 13// template<class R, class T>14// constexpr R saturate_cast(T x) noexcept; // freestanding15 16#include <cassert>17#include <climits>18#include <concepts>19#include <limits>20#include <numeric>21 22#include "test_macros.h"23 24// Smaller to larger25static_assert(noexcept(std::saturate_cast<signed int>(std::numeric_limits<signed char>::max())));26static_assert(noexcept(std::saturate_cast<signed int>(std::numeric_limits<unsigned char>::max())));27 28static_assert(noexcept(std::saturate_cast<unsigned int>(std::numeric_limits<signed char>::max())));29static_assert(noexcept(std::saturate_cast<unsigned int>(std::numeric_limits<unsigned char>::max())));30 31// Same type32static_assert(noexcept(std::saturate_cast<signed long int>(std::numeric_limits<signed long int>::max())));33static_assert(noexcept(std::saturate_cast<unsigned long int>(std::numeric_limits<unsigned long int>::max())));34 35// Larger to smaller36static_assert(noexcept(std::saturate_cast<signed char>(std::numeric_limits<signed int>::max())));37static_assert(noexcept(std::saturate_cast<signed char>(std::numeric_limits<unsigned int>::max())));38 39static_assert(noexcept(std::saturate_cast<unsigned char>(std::numeric_limits<signed int>::max())));40static_assert(noexcept(std::saturate_cast<unsigned char>(std::numeric_limits<unsigned int>::max())));41 42// Tests43 44constexpr bool test() {45 // clang-format off46 47#ifndef TEST_HAS_NO_INT12848 using SIntT = __int128_t;49 using UIntT = __uint128_t;50#else51 using SIntT = long long int;52 using UIntT = unsigned long long int;53#endif54 55 // Constants the values of which depend on the context (platform)56 57 constexpr auto sBigMin = std::numeric_limits<SIntT>::min();58 constexpr auto sZero = SIntT{0};59 constexpr auto sBigMax = std::numeric_limits<SIntT>::max();60 61 constexpr auto uZero = UIntT{0};62 constexpr auto uBigMax = std::numeric_limits<UIntT>::max();63 64 // Constants to avoid casting in place65 66 constexpr auto O_C = static_cast<signed char>(0);67 constexpr auto O_UC = static_cast<unsigned char>(0);68 69 constexpr auto O_S = static_cast<signed short int>(0);70 constexpr auto O_US = static_cast<unsigned short int>(0);71 72 // signed char73 74 std::same_as<signed char> decltype(auto) _ = std::saturate_cast<signed char>(SCHAR_MAX);75 assert(std::saturate_cast<signed char>(SCHAR_MIN) == SCHAR_MIN);76 assert(std::saturate_cast<signed char>( O_C) == O_C);77 assert(std::saturate_cast<signed char>(SCHAR_MAX) == SCHAR_MAX);78 79 std::same_as<signed char> decltype(auto) _ = std::saturate_cast<signed char>(UCHAR_MAX);80 assert(std::saturate_cast<signed char>( O_UC) == O_C);81 assert(std::saturate_cast<signed char>(UCHAR_MAX) == SCHAR_MAX);82 83 std::same_as<signed char> decltype(auto) _ = std::saturate_cast<signed char>(sBigMax);84 assert(std::saturate_cast<signed char>(sBigMin) == SCHAR_MIN); // saturated85 assert(std::saturate_cast<signed char>( sZero) == O_C);86 assert(std::saturate_cast<signed char>(sBigMax) == SCHAR_MAX); // saturated87 88 std::same_as<signed char> decltype(auto) _ = std::saturate_cast<signed char>(uBigMax);89 assert(std::saturate_cast<signed char>( uZero) == O_C);90 assert(std::saturate_cast<signed char>(uBigMax) == SCHAR_MAX); // saturated91 92 // short93 94 std::same_as<signed short int> decltype(auto) _ = std::saturate_cast<signed short int>(SCHAR_MAX);95 assert(std::saturate_cast<signed short int>(SCHAR_MIN) == static_cast<signed short int>(SCHAR_MIN));96 assert(std::saturate_cast<signed short int>( O_C) == O_S);97 assert(std::saturate_cast<signed short int>(SCHAR_MAX) == static_cast<signed short int>(SCHAR_MAX));98 99 std::same_as<signed short int> decltype(auto) _ = std::saturate_cast<signed short int>(UCHAR_MAX);100 assert(std::saturate_cast<signed short int>( O_UC) == O_S);101 assert(std::saturate_cast<signed short int>(UCHAR_MAX) == static_cast<signed short int>(UCHAR_MAX));102 103 std::same_as<signed short int> decltype(auto) _ = std::saturate_cast<signed short int>(SHRT_MAX);104 assert(std::saturate_cast<signed short int>( SHRT_MIN) == SHRT_MIN);105 assert(std::saturate_cast<signed short int>( O_S) == O_S);106 assert(std::saturate_cast<signed short int>( SHRT_MAX) == SHRT_MAX);107 108 std::same_as<signed short int> decltype(auto) _ = std::saturate_cast<signed short int>(USHRT_MAX);109 assert(std::saturate_cast<signed short int>( O_US) == O_S);110 assert(std::saturate_cast<signed short int>(USHRT_MAX) == SHRT_MAX); // saturated111 112 std::same_as<signed short int> decltype(auto) _ = std::saturate_cast<signed short int>(sBigMax);113 assert(std::saturate_cast<signed short int>( sBigMin) == SHRT_MIN); // saturated114 assert(std::saturate_cast<signed short int>( sZero) == O_S);115 assert(std::saturate_cast<signed short int>( sBigMax) == SHRT_MAX); // saturated116 117 std::same_as<signed short int> decltype(auto) _ = std::saturate_cast<signed short int>(uBigMax);118 assert(std::saturate_cast<signed short int>( uZero) == O_S);119 assert(std::saturate_cast<signed short int>( uBigMax) == SHRT_MAX); // saturated120 121 // int122 123 std::same_as<signed int> decltype(auto) _ = std::saturate_cast<signed int>(SCHAR_MAX);124 assert(std::saturate_cast<signed int>(SCHAR_MIN) == static_cast<signed int>(SCHAR_MIN));125 assert(std::saturate_cast<signed int>( O_C) == 0);126 assert(std::saturate_cast<signed int>(SCHAR_MAX) == static_cast<signed int>(SCHAR_MAX));127 128 std::same_as<signed int> decltype(auto) _ = std::saturate_cast<signed int>(UCHAR_MAX);129 assert(std::saturate_cast<signed int>( O_UC) == 0);130 assert(std::saturate_cast<signed int>(UCHAR_MAX) == static_cast<signed int>(UCHAR_MAX));131 132 std::same_as<signed int> decltype(auto) _ = std::saturate_cast<signed int>(INT_MAX);133 assert(std::saturate_cast<signed int>( INT_MIN) == INT_MIN);134 assert(std::saturate_cast<signed int>( 0) == 0);135 assert(std::saturate_cast<signed int>( INT_MAX) == INT_MAX);136 137 std::same_as<signed int> decltype(auto) _ = std::saturate_cast<signed int>(UINT_MAX);138 assert(std::saturate_cast<signed int>( 0) == 0);139 assert(std::saturate_cast<signed int>(UINT_MAX) == INT_MAX); // saturated140 141 std::same_as<signed int> decltype(auto) _ = std::saturate_cast<signed int>(sBigMax);142 assert(std::saturate_cast<signed int>( sBigMin) == INT_MIN); // saturated143 assert(std::saturate_cast<signed int>( sZero) == 0);144 assert(std::saturate_cast<signed int>( sBigMax) == INT_MAX); // saturated145 146 std::same_as<signed int> decltype(auto) _ = std::saturate_cast<signed int>(uBigMax);147 assert(std::saturate_cast<signed int>( uZero) == 0);148 assert(std::saturate_cast<signed int>( uBigMax) == INT_MAX); // saturated149 150 // long151 152 std::same_as<signed long int> decltype(auto) _ = std::saturate_cast<signed long int>(SCHAR_MAX);153 assert(std::saturate_cast<signed long int>(SCHAR_MIN) == static_cast<signed long int>(SCHAR_MIN));154 assert(std::saturate_cast<signed long int>( O_C) == 0L);155 assert(std::saturate_cast<signed long int>(SCHAR_MAX) == static_cast<signed long int>(SCHAR_MAX));156 157 std::same_as<signed long int> decltype(auto) _ = std::saturate_cast<signed long int>(UCHAR_MAX);158 assert(std::saturate_cast<signed long int>( O_UC) == 0L);159 assert(std::saturate_cast<signed long int>(UCHAR_MAX) == static_cast<signed long int>(UCHAR_MAX));160 161 std::same_as<signed long int> decltype(auto) _ = std::saturate_cast<signed long int>(LONG_MAX);162 assert(std::saturate_cast<signed long int>( LONG_MIN) == LONG_MIN);163 assert(std::saturate_cast<signed long int>( 0L) == 0L);164 assert(std::saturate_cast<signed long int>( LONG_MAX) == LONG_MAX);165 166 std::same_as<signed long int> decltype(auto) _ = std::saturate_cast<signed long int>(ULONG_MAX);167 assert(std::saturate_cast<signed long int>( 0UL) == 0L);168 assert(std::saturate_cast<signed long int>(ULONG_MAX) == LONG_MAX); // saturated169 170 std::same_as<signed long int> decltype(auto) _ = std::saturate_cast<signed long int>(sBigMax);171 assert(std::saturate_cast<signed long int>( sBigMin) == LONG_MIN); // saturated172 assert(std::saturate_cast<signed long int>( sZero) == 0L);173 assert(std::saturate_cast<signed long int>( sBigMax) == LONG_MAX); // saturated174 175 std::same_as<signed long int> decltype(auto) _ = std::saturate_cast<signed long int>(uBigMax);176 assert(std::saturate_cast<signed long int>( uZero) == 0L);177 assert(std::saturate_cast<signed long int>( uBigMax) == LONG_MAX); // saturated178 179 // long long180 181 std::same_as<signed long long int> decltype(auto) _ = std::saturate_cast<signed long long int>(SCHAR_MAX);182 assert(std::saturate_cast<signed long long int>(SCHAR_MIN) == static_cast<signed long long int>(SCHAR_MIN));183 assert(std::saturate_cast<signed long long int>( 0LL) == 0LL);184 assert(std::saturate_cast<signed long long int>(SCHAR_MAX) == static_cast<signed long long int>(SCHAR_MAX));185 186 std::same_as<signed long long int> decltype(auto) _ = std::saturate_cast<signed long long int>(UCHAR_MAX);187 assert(std::saturate_cast<signed long long int>( O_UC) == 0LL);188 assert(std::saturate_cast<signed long long int>(UCHAR_MAX) == static_cast<signed long long int>(UCHAR_MAX));189 190 std::same_as<signed long long int> decltype(auto) _ = std::saturate_cast<signed long long int>(LLONG_MIN);191 assert(std::saturate_cast<signed long long int>(LLONG_MIN) == LLONG_MIN);192 assert(std::saturate_cast<signed long long int>( 0LL) == 0LL);193 assert(std::saturate_cast<signed long long int>(LLONG_MAX) == LLONG_MAX);194 195 std::same_as<signed long long int> decltype(auto) _ = std::saturate_cast<signed long long int>(ULLONG_MAX);196 assert(std::saturate_cast<signed long long int>( 0ULL) == 0LL);197 assert(std::saturate_cast<signed long long int>(ULLONG_MAX) == LLONG_MAX); // saturated198 199#ifndef TEST_HAS_NO_INT128200 std::same_as<signed long long int> decltype(auto) _ = std::saturate_cast<signed long long int>(sBigMax);201 assert(std::saturate_cast<signed long long int>( sBigMin) == LLONG_MIN); // (128-bit) saturated202 assert(std::saturate_cast<signed long long int>( sZero) == 0LL);203 assert(std::saturate_cast<signed long long int>( sBigMax) == LLONG_MAX); // (128-bit) saturated204 205 std::same_as<signed long long int> decltype(auto) _ = std::saturate_cast<signed long long int>(uBigMax);206 assert(std::saturate_cast<signed long long int>( uZero) == 0LL);207 assert(std::saturate_cast<signed long long int>( uBigMax) == LLONG_MAX); // (128-bit) saturated208 209 std::same_as<__int128_t> decltype(auto) _ = std::saturate_cast<__int128_t>(SCHAR_MAX);210 assert(std::saturate_cast<__int128_t>(SCHAR_MIN) == static_cast<__int128_t>(SCHAR_MIN));211 assert(std::saturate_cast<__int128_t>( O_C) == sZero);212 assert(std::saturate_cast<__int128_t>(SCHAR_MAX) == static_cast<__int128_t>(SCHAR_MAX));213 214 std::same_as<__int128_t> decltype(auto) _ = std::saturate_cast<__int128_t>(UCHAR_MAX);215 assert(std::saturate_cast<__int128_t>( O_UC) == sZero);216 assert(std::saturate_cast<__int128_t>(UCHAR_MAX) == static_cast<__int128_t>(UCHAR_MAX));217 218 std::same_as<__int128_t> decltype(auto) _ = std::saturate_cast<__int128_t>(sBigMax);219 assert(std::saturate_cast<__int128_t>( sBigMin) == sBigMin);220 assert(std::saturate_cast<__int128_t>( sZero) == sZero);221 assert(std::saturate_cast<__int128_t>( sBigMax) == sBigMax);222 223 std::same_as<__int128_t> decltype(auto) _ = std::saturate_cast<__int128_t>(uBigMax);224 assert(std::saturate_cast<__int128_t>( uZero) == sZero);225 assert(std::saturate_cast<__int128_t>( uBigMax) == sBigMax); // saturated226#endif227 228 // unsigned char229 230 std::same_as<unsigned char> decltype(auto) _ = std::saturate_cast<unsigned char>(SCHAR_MAX);231 assert(std::saturate_cast<unsigned char>(SCHAR_MIN) == O_UC);232 assert(std::saturate_cast<unsigned char>( O_C) == O_UC);233 assert(std::saturate_cast<unsigned char>(SCHAR_MAX) == static_cast<unsigned char>(SCHAR_MAX));234 235 std::same_as<unsigned char> decltype(auto) _ = std::saturate_cast<unsigned char>(UCHAR_MAX);236 assert(std::saturate_cast<unsigned char>( O_UC) == O_UC);237 assert(std::saturate_cast<unsigned char>(UCHAR_MAX) == UCHAR_MAX);238 239 std::same_as<unsigned char> decltype(auto) _ = std::saturate_cast<unsigned char>(sBigMax);240 assert(std::saturate_cast<unsigned char>( sBigMin) == O_UC); // saturated241 assert(std::saturate_cast<unsigned char>( sZero) == O_UC);242 assert(std::saturate_cast<unsigned char>( sBigMax) == UCHAR_MAX); // saturated243 244 std::same_as<unsigned char> decltype(auto) _ = std::saturate_cast<unsigned char>(uBigMax);245 assert(std::saturate_cast<unsigned char>( uZero) == O_UC);246 assert(std::saturate_cast<unsigned char>( uBigMax) == UCHAR_MAX); // saturated247 248 // unsigned short249 250 std::same_as<unsigned short int> decltype(auto) _ = std::saturate_cast<unsigned short int>(SCHAR_MAX);251 assert(std::saturate_cast<unsigned short int>(SCHAR_MIN) == O_US);252 assert(std::saturate_cast<unsigned short int>( O_C) == O_US);253 assert(std::saturate_cast<unsigned short int>(SCHAR_MAX) == static_cast<unsigned short int>(SCHAR_MAX));254 255 std::same_as<unsigned short int> decltype(auto) _ = std::saturate_cast<unsigned short int>(UCHAR_MAX);256 assert(std::saturate_cast<unsigned short int>( O_UC) == O_US);257 assert(std::saturate_cast<unsigned short int>(UCHAR_MAX) == static_cast<unsigned short int>(UCHAR_MAX));258 259 std::same_as<unsigned short int> decltype(auto) _ = std::saturate_cast<unsigned short int>(SCHAR_MIN);260 assert(std::saturate_cast<unsigned short int>( SHRT_MIN) == O_US);261 assert(std::saturate_cast<unsigned short int>( O_S) == O_US);262 assert(std::saturate_cast<unsigned short int>( SHRT_MAX) == static_cast<unsigned short int>(SHRT_MAX));263 264 std::same_as<unsigned short int> decltype(auto) _ = std::saturate_cast<unsigned short int>(UCHAR_MAX);265 assert(std::saturate_cast<unsigned short int>( O_US) == O_US);266 assert(std::saturate_cast<unsigned short int>(USHRT_MAX) == USHRT_MAX);267 268 std::same_as<unsigned short int> decltype(auto) _ = std::saturate_cast<unsigned short int>(sBigMax);269 assert(std::saturate_cast<unsigned short int>( sBigMin) == O_US); // saturated270 assert(std::saturate_cast<unsigned short int>( sZero) == O_US);271 assert(std::saturate_cast<unsigned short int>( sBigMax) == USHRT_MAX); // saturated272 273 std::same_as<unsigned short int> decltype(auto) _ = std::saturate_cast<unsigned short int>(uBigMax);274 assert(std::saturate_cast<unsigned short int>( uZero) == O_US);275 assert(std::saturate_cast<unsigned short int>( uBigMax) == USHRT_MAX); // saturated276 277 // unsigned int278 279 std::same_as<unsigned int> decltype(auto) _ = std::saturate_cast<unsigned int>(SCHAR_MAX);280 assert(std::saturate_cast<unsigned int>(SCHAR_MIN) == O_US);281 assert(std::saturate_cast<unsigned int>( O_UC) == 0U);282 assert(std::saturate_cast<unsigned int>(SCHAR_MAX) == static_cast<unsigned int>(SCHAR_MAX));283 284 std::same_as<unsigned int> decltype(auto) _ = std::saturate_cast<unsigned int>(UCHAR_MAX);285 assert(std::saturate_cast<unsigned int>( O_UC) == 0U);286 assert(std::saturate_cast<unsigned int>(UCHAR_MAX) == static_cast<unsigned int>(UCHAR_MAX));287 288 std::same_as<unsigned int> decltype(auto) _ = std::saturate_cast<unsigned int>(INT_MAX);289 assert(std::saturate_cast<unsigned int>( INT_MIN) == 0U);290 assert(std::saturate_cast<unsigned int>( 0) == 0U);291 assert(std::saturate_cast<unsigned int>( INT_MAX) == static_cast<unsigned int>(INT_MAX));292 293 std::same_as<unsigned int> decltype(auto) _ = std::saturate_cast<unsigned int>(UINT_MAX);294 assert(std::saturate_cast<unsigned int>( 0U) == 0U);295 assert(std::saturate_cast<unsigned int>( UINT_MAX) == UINT_MAX);296 297 std::same_as<unsigned int> decltype(auto) _ = std::saturate_cast<unsigned int>(sBigMax);298 assert(std::saturate_cast<unsigned int>( sBigMin) == 0U); // saturated299 assert(std::saturate_cast<unsigned int>( sZero) == 0U);300 assert(std::saturate_cast<unsigned int>( sBigMax) == UINT_MAX); // saturated301 302 std::same_as<unsigned int> decltype(auto) _ = std::saturate_cast<unsigned int>(uBigMax);303 assert(std::saturate_cast<unsigned int>( uZero) == 0U);304 assert(std::saturate_cast<unsigned int>( uBigMax) == UINT_MAX); // saturated305 306 // unsigned long307 308 std::same_as<unsigned long int> decltype(auto) _ = std::saturate_cast<unsigned long int>(SCHAR_MAX);309 assert(std::saturate_cast<unsigned long int>(SCHAR_MIN) == 0UL);310 assert(std::saturate_cast<unsigned long int>( O_C) == 0UL);311 assert(std::saturate_cast<unsigned long int>(SCHAR_MAX) == static_cast<unsigned long int>(SCHAR_MAX));312 313 std::same_as<unsigned long int> decltype(auto) _ = std::saturate_cast<unsigned long int>(UCHAR_MAX);314 assert(std::saturate_cast<unsigned long int>( O_UC) == 0UL);315 assert(std::saturate_cast<unsigned long int>(UCHAR_MAX) == static_cast<unsigned long int>(UCHAR_MAX));316 317 std::same_as<unsigned long int> decltype(auto) _ = std::saturate_cast<unsigned long int>(LONG_MAX);318 assert(std::saturate_cast<unsigned long int>( LONG_MIN) == 0UL);319 assert(std::saturate_cast<unsigned long int>( 0L) == 0UL);320 assert(std::saturate_cast<unsigned long int>( LONG_MAX) == static_cast<unsigned long int>(LONG_MAX));321 322 std::same_as<unsigned long int> decltype(auto) _ = std::saturate_cast<unsigned long int>(ULONG_MAX);323 assert(std::saturate_cast<unsigned long int>( 0UL) == 0UL);324 assert(std::saturate_cast<unsigned long int>(ULONG_MAX) == ULONG_MAX);325 326 std::same_as<unsigned long int> decltype(auto) _ = std::saturate_cast<unsigned long int>(sBigMax);327 assert(std::saturate_cast<unsigned long int>( sBigMin) == 0UL); // saturated328 assert(std::saturate_cast<unsigned long int>( sZero) == 0UL);329 assert(std::saturate_cast<unsigned long int>( sBigMax) == (sizeof(UIntT) > sizeof(unsigned long int) ? ULONG_MAX : LONG_MAX)); // saturated depending on underlying types330 331 std::same_as<unsigned long int> decltype(auto) _ = std::saturate_cast<unsigned long int>(uBigMax);332 assert(std::saturate_cast<unsigned long int>( uZero) == 0UL);333 assert(std::saturate_cast<unsigned long int>( uBigMax) == ULONG_MAX); // saturated334 335 // unsigned long long336 337 std::same_as<unsigned long long int> decltype(auto) _ = std::saturate_cast<unsigned long long int>(SCHAR_MAX);338 assert(std::saturate_cast<unsigned long long int>( SCHAR_MIN) == 0ULL);339 assert(std::saturate_cast<unsigned long long int>( O_C) == 0ULL);340 assert(std::saturate_cast<unsigned long long int>( SCHAR_MAX) == static_cast<unsigned long long int>(SCHAR_MAX));341 342 std::same_as<unsigned long long int> decltype(auto) _ = std::saturate_cast<unsigned long long int>(UCHAR_MAX);343 assert(std::saturate_cast<unsigned long long int>( O_UC) == 0ULL);344 assert(std::saturate_cast<unsigned long long int>( UCHAR_MAX) == static_cast<unsigned long long int>(UCHAR_MAX));345 346 std::same_as<unsigned long long int> decltype(auto) _ = std::saturate_cast<unsigned long long int>(LLONG_MAX);347 assert(std::saturate_cast<unsigned long long int>( LLONG_MIN) == 0ULL);348 assert(std::saturate_cast<unsigned long long int>( 0LL) == 0ULL);349 assert(std::saturate_cast<unsigned long long int>( LLONG_MAX) == static_cast<unsigned long long int>(LLONG_MAX));350 351 std::same_as<unsigned long long int> decltype(auto) _ = std::saturate_cast<unsigned long long int>(ULLONG_MAX);352 assert(std::saturate_cast<unsigned long long int>( 0ULL) == 0ULL);353 assert(std::saturate_cast<unsigned long long int>(ULLONG_MAX) == ULLONG_MAX);354 355#ifndef TEST_HAS_NO_INT128356 std::same_as<unsigned long long int> decltype(auto) _ = std::saturate_cast<unsigned long long int>(sBigMax);357 assert(std::saturate_cast<unsigned long long int>( sBigMin) == 0ULL); // (128-bit) saturated358 assert(std::saturate_cast<unsigned long long int>( sZero) == 0ULL);359 assert(std::saturate_cast<unsigned long long int>( sBigMax) == ULLONG_MAX); // (128-bit) saturated360 361 std::same_as<unsigned long long int> decltype(auto) _ = std::saturate_cast<unsigned long long int>(uBigMax);362 assert(std::saturate_cast<unsigned long long int>( uZero) == 0ULL);363 assert(std::saturate_cast<unsigned long long int>( uBigMax) == ULLONG_MAX); // (128-bit) saturated364 365 std::same_as<__uint128_t> decltype(auto) _ = std::saturate_cast<__uint128_t>(SCHAR_MIN);366 assert(std::saturate_cast<__uint128_t>(SCHAR_MIN) == uZero);367 assert(std::saturate_cast<__uint128_t>( O_C) == uZero);368 assert(std::saturate_cast<__uint128_t>(SCHAR_MAX) == static_cast<__uint128_t>(SCHAR_MAX));369 370 std::same_as<__uint128_t> decltype(auto) _ = std::saturate_cast<__uint128_t>(UCHAR_MAX);371 assert(std::saturate_cast<__uint128_t>( O_UC) == uZero);372 assert(std::saturate_cast<__uint128_t>(UCHAR_MAX) == static_cast<__uint128_t>(UCHAR_MAX));373 374 std::same_as<__uint128_t> decltype(auto) _ = std::saturate_cast<__uint128_t>(sBigMax);375 assert(std::saturate_cast<__uint128_t>( sBigMin) == uZero); // saturated376 assert(std::saturate_cast<__uint128_t>( sZero) == uZero);377 assert(std::saturate_cast<__uint128_t>( sBigMax) == static_cast<__uint128_t>(sBigMax));378 379 std::same_as<__uint128_t> decltype(auto) _ = std::saturate_cast<__uint128_t>(uBigMax);380 assert(std::saturate_cast<__uint128_t>( uZero) == uZero);381 assert(std::saturate_cast<__uint128_t>( uBigMax) == uBigMax);382#endif383 384 // clang-format on385 386 return true;387}388 389int main(int, char**) {390 test();391 static_assert(test());392 393 return 0;394}395