1*df9167bfSStephan T. Lavavej //===----------------------------------------------------------------------===// 2*df9167bfSStephan T. Lavavej // 3*df9167bfSStephan T. Lavavej // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*df9167bfSStephan T. Lavavej // See https://llvm.org/LICENSE.txt for license information. 5*df9167bfSStephan T. Lavavej // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*df9167bfSStephan T. Lavavej // 7*df9167bfSStephan T. Lavavej //===----------------------------------------------------------------------===// 8*df9167bfSStephan T. Lavavej 9*df9167bfSStephan T. Lavavej // UNSUPPORTED: c++03, c++11, c++14, c++17 10*df9167bfSStephan T. Lavavej 11*df9167bfSStephan T. Lavavej // template<class T> 12*df9167bfSStephan T. Lavavej // concept unsigned_integral = // see below 13*df9167bfSStephan T. Lavavej 14*df9167bfSStephan T. Lavavej #include <concepts> 15*df9167bfSStephan T. Lavavej #include <type_traits> 16*df9167bfSStephan T. Lavavej 17*df9167bfSStephan T. Lavavej #include "arithmetic.h" 18*df9167bfSStephan T. Lavavej #include "test_macros.h" 19*df9167bfSStephan T. Lavavej 20*df9167bfSStephan T. Lavavej template <typename T> CheckUnsignedIntegralQualifiers()21*df9167bfSStephan T. Lavavejconstexpr bool CheckUnsignedIntegralQualifiers() { 22*df9167bfSStephan T. Lavavej constexpr bool result = std::unsigned_integral<T>; 23*df9167bfSStephan T. Lavavej static_assert(std::unsigned_integral<const T> == result); 24*df9167bfSStephan T. Lavavej static_assert(std::unsigned_integral<volatile T> == result); 25*df9167bfSStephan T. Lavavej static_assert(std::unsigned_integral<const volatile T> == result); 26*df9167bfSStephan T. Lavavej 27*df9167bfSStephan T. Lavavej static_assert(!std::unsigned_integral<T&>); 28*df9167bfSStephan T. Lavavej static_assert(!std::unsigned_integral<const T&>); 29*df9167bfSStephan T. Lavavej static_assert(!std::unsigned_integral<volatile T&>); 30*df9167bfSStephan T. Lavavej static_assert(!std::unsigned_integral<const volatile T&>); 31*df9167bfSStephan T. Lavavej 32*df9167bfSStephan T. Lavavej static_assert(!std::unsigned_integral<T&&>); 33*df9167bfSStephan T. Lavavej static_assert(!std::unsigned_integral<const T&&>); 34*df9167bfSStephan T. Lavavej static_assert(!std::unsigned_integral<volatile T&&>); 35*df9167bfSStephan T. Lavavej static_assert(!std::unsigned_integral<const volatile T&&>); 36*df9167bfSStephan T. Lavavej 37*df9167bfSStephan T. Lavavej static_assert(!std::unsigned_integral<T*>); 38*df9167bfSStephan T. Lavavej static_assert(!std::unsigned_integral<const T*>); 39*df9167bfSStephan T. Lavavej static_assert(!std::unsigned_integral<volatile T*>); 40*df9167bfSStephan T. Lavavej static_assert(!std::unsigned_integral<const volatile T*>); 41*df9167bfSStephan T. Lavavej 42*df9167bfSStephan T. Lavavej static_assert(!std::unsigned_integral<T (*)()>); 43*df9167bfSStephan T. Lavavej static_assert(!std::unsigned_integral<T (&)()>); 44*df9167bfSStephan T. Lavavej static_assert(!std::unsigned_integral<T (&&)()>); 45*df9167bfSStephan T. Lavavej 46*df9167bfSStephan T. Lavavej return result; 47*df9167bfSStephan T. Lavavej } 48*df9167bfSStephan T. Lavavej 49*df9167bfSStephan T. Lavavej // standard unsigned types 50*df9167bfSStephan T. Lavavej static_assert(CheckUnsignedIntegralQualifiers<unsigned char>()); 51*df9167bfSStephan T. Lavavej static_assert(CheckUnsignedIntegralQualifiers<unsigned short>()); 52*df9167bfSStephan T. Lavavej static_assert(CheckUnsignedIntegralQualifiers<unsigned int>()); 53*df9167bfSStephan T. Lavavej static_assert(CheckUnsignedIntegralQualifiers<unsigned long>()); 54*df9167bfSStephan T. Lavavej static_assert(CheckUnsignedIntegralQualifiers<unsigned long long>()); 55*df9167bfSStephan T. Lavavej 56*df9167bfSStephan T. Lavavej // Whether bool and character types are signed or unsigned is impl-defined 57*df9167bfSStephan T. Lavavej static_assert(CheckUnsignedIntegralQualifiers<wchar_t>() == !std::is_signed_v<wchar_t>); 58*df9167bfSStephan T. Lavavej static_assert(CheckUnsignedIntegralQualifiers<bool>() == !std::is_signed_v<bool>); 59*df9167bfSStephan T. Lavavej static_assert(CheckUnsignedIntegralQualifiers<char>() == !std::is_signed_v<char>); 60*df9167bfSStephan T. Lavavej static_assert(CheckUnsignedIntegralQualifiers<char8_t>() == !std::is_signed_v<char8_t>); 61*df9167bfSStephan T. Lavavej static_assert(CheckUnsignedIntegralQualifiers<char16_t>() == !std::is_signed_v<char16_t>); 62*df9167bfSStephan T. Lavavej static_assert(CheckUnsignedIntegralQualifiers<char32_t>() == !std::is_signed_v<char32_t>); 63*df9167bfSStephan T. Lavavej 64*df9167bfSStephan T. Lavavej // extended integers 65*df9167bfSStephan T. Lavavej #ifndef TEST_HAS_NO_INT128 66*df9167bfSStephan T. Lavavej static_assert(CheckUnsignedIntegralQualifiers<__uint128_t>()); 67*df9167bfSStephan T. Lavavej static_assert(!CheckUnsignedIntegralQualifiers<__int128_t>()); 68*df9167bfSStephan T. Lavavej #endif 69*df9167bfSStephan T. Lavavej 70*df9167bfSStephan T. Lavavej // integer types that aren't unsigned integrals 71*df9167bfSStephan T. Lavavej static_assert(!CheckUnsignedIntegralQualifiers<signed char>()); 72*df9167bfSStephan T. Lavavej static_assert(!CheckUnsignedIntegralQualifiers<short>()); 73*df9167bfSStephan T. Lavavej static_assert(!CheckUnsignedIntegralQualifiers<int>()); 74*df9167bfSStephan T. Lavavej static_assert(!CheckUnsignedIntegralQualifiers<long>()); 75*df9167bfSStephan T. Lavavej static_assert(!CheckUnsignedIntegralQualifiers<long long>()); 76*df9167bfSStephan T. Lavavej 77*df9167bfSStephan T. Lavavej static_assert(!std::unsigned_integral<void>); 78*df9167bfSStephan T. Lavavej static_assert(!CheckUnsignedIntegralQualifiers<float>()); 79*df9167bfSStephan T. Lavavej static_assert(!CheckUnsignedIntegralQualifiers<double>()); 80*df9167bfSStephan T. Lavavej static_assert(!CheckUnsignedIntegralQualifiers<long double>()); 81*df9167bfSStephan T. Lavavej 82*df9167bfSStephan T. Lavavej static_assert(!CheckUnsignedIntegralQualifiers<ClassicEnum>()); 83*df9167bfSStephan T. Lavavej static_assert(!CheckUnsignedIntegralQualifiers<ScopedEnum>()); 84*df9167bfSStephan T. Lavavej static_assert(!CheckUnsignedIntegralQualifiers<EmptyStruct>()); 85*df9167bfSStephan T. Lavavej static_assert(!CheckUnsignedIntegralQualifiers<int EmptyStruct::*>()); 86*df9167bfSStephan T. Lavavej static_assert(!CheckUnsignedIntegralQualifiers<int (EmptyStruct::*)()>()); 87*df9167bfSStephan T. Lavavej 88*df9167bfSStephan T. Lavavej static_assert(CheckSubsumption(0)); 89*df9167bfSStephan T. Lavavej static_assert(CheckSubsumption(0U)); 90