brintos

brintos / llvm-project-archived public Read only

0
0
Text · 21.2 KiB · 86e2e61 Raw
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