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