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-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 // UNSUPPORTED: c++03, c++11, c++14, c++17 10 // UNSUPPORTED: libcpp-no-concepts 11 12 // template<class T> 13 // concept unsigned_integral = // see below 14 15 #include <concepts> 16 #include <type_traits> 17 18 #include "arithmetic.h" 19 #include "test_macros.h" 20 21 template <typename T> 22 constexpr bool CheckUnsignedIntegralQualifiers() { 23 constexpr bool result = std::unsigned_integral<T>; 24 static_assert(std::unsigned_integral<const T> == result); 25 static_assert(std::unsigned_integral<volatile T> == result); 26 static_assert(std::unsigned_integral<const volatile T> == result); 27 28 static_assert(!std::unsigned_integral<T&>); 29 static_assert(!std::unsigned_integral<const T&>); 30 static_assert(!std::unsigned_integral<volatile T&>); 31 static_assert(!std::unsigned_integral<const volatile T&>); 32 33 static_assert(!std::unsigned_integral<T&&>); 34 static_assert(!std::unsigned_integral<const T&&>); 35 static_assert(!std::unsigned_integral<volatile T&&>); 36 static_assert(!std::unsigned_integral<const volatile T&&>); 37 38 static_assert(!std::unsigned_integral<T*>); 39 static_assert(!std::unsigned_integral<const T*>); 40 static_assert(!std::unsigned_integral<volatile T*>); 41 static_assert(!std::unsigned_integral<const volatile T*>); 42 43 static_assert(!std::unsigned_integral<T (*)()>); 44 static_assert(!std::unsigned_integral<T (&)()>); 45 static_assert(!std::unsigned_integral<T(&&)()>); 46 47 return result; 48 } 49 50 // standard unsigned types 51 static_assert(CheckUnsignedIntegralQualifiers<unsigned char>()); 52 static_assert(CheckUnsignedIntegralQualifiers<unsigned short>()); 53 static_assert(CheckUnsignedIntegralQualifiers<unsigned int>()); 54 static_assert(CheckUnsignedIntegralQualifiers<unsigned long>()); 55 static_assert(CheckUnsignedIntegralQualifiers<unsigned long long>()); 56 57 // Whether bool and character types are signed or unsigned is impl-defined 58 static_assert(CheckUnsignedIntegralQualifiers<wchar_t>() == 59 !std::is_signed_v<wchar_t>); 60 static_assert(CheckUnsignedIntegralQualifiers<bool>() == 61 !std::is_signed_v<bool>); 62 static_assert(CheckUnsignedIntegralQualifiers<char>() == 63 !std::is_signed_v<char>); 64 static_assert(CheckUnsignedIntegralQualifiers<char8_t>() == 65 !std::is_signed_v<char8_t>); 66 static_assert(CheckUnsignedIntegralQualifiers<char16_t>() == 67 !std::is_signed_v<char16_t>); 68 static_assert(CheckUnsignedIntegralQualifiers<char32_t>() == 69 !std::is_signed_v<char32_t>); 70 71 // extended integers 72 #ifndef TEST_HAS_NO_INT128 73 static_assert(CheckUnsignedIntegralQualifiers<__uint128_t>()); 74 static_assert(!CheckUnsignedIntegralQualifiers<__int128_t>()); 75 #endif 76 77 // integer types that aren't unsigned integrals 78 static_assert(!CheckUnsignedIntegralQualifiers<signed char>()); 79 static_assert(!CheckUnsignedIntegralQualifiers<short>()); 80 static_assert(!CheckUnsignedIntegralQualifiers<int>()); 81 static_assert(!CheckUnsignedIntegralQualifiers<long>()); 82 static_assert(!CheckUnsignedIntegralQualifiers<long long>()); 83 84 static_assert(!std::unsigned_integral<void>); 85 static_assert(!CheckUnsignedIntegralQualifiers<float>()); 86 static_assert(!CheckUnsignedIntegralQualifiers<double>()); 87 static_assert(!CheckUnsignedIntegralQualifiers<long double>()); 88 89 static_assert(!CheckUnsignedIntegralQualifiers<ClassicEnum>()); 90 static_assert(!CheckUnsignedIntegralQualifiers<ScopedEnum>()); 91 static_assert(!CheckUnsignedIntegralQualifiers<EmptyStruct>()); 92 static_assert(!CheckUnsignedIntegralQualifiers<int EmptyStruct::*>()); 93 static_assert(!CheckUnsignedIntegralQualifiers<int (EmptyStruct::*)()>()); 94 95 static_assert(CheckSubsumption(0)); 96 static_assert(CheckSubsumption(0U)); 97 98 int main(int, char**) { return 0; } 99