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 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> CheckIntegralQualifiers()21*df9167bfSStephan T. Lavavejconstexpr bool CheckIntegralQualifiers() { 22*df9167bfSStephan T. Lavavej constexpr bool result = std::integral<T>; 23*df9167bfSStephan T. Lavavej static_assert(std::integral<const T> == result); 24*df9167bfSStephan T. Lavavej static_assert(std::integral<volatile T> == result); 25*df9167bfSStephan T. Lavavej static_assert(std::integral<const volatile T> == result); 26*df9167bfSStephan T. Lavavej 27*df9167bfSStephan T. Lavavej static_assert(!std::integral<T&>); 28*df9167bfSStephan T. Lavavej static_assert(!std::integral<const T&>); 29*df9167bfSStephan T. Lavavej static_assert(!std::integral<volatile T&>); 30*df9167bfSStephan T. Lavavej static_assert(!std::integral<const volatile T&>); 31*df9167bfSStephan T. Lavavej 32*df9167bfSStephan T. Lavavej static_assert(!std::integral<T&&>); 33*df9167bfSStephan T. Lavavej static_assert(!std::integral<const T&&>); 34*df9167bfSStephan T. Lavavej static_assert(!std::integral<volatile T&&>); 35*df9167bfSStephan T. Lavavej static_assert(!std::integral<const volatile T&&>); 36*df9167bfSStephan T. Lavavej 37*df9167bfSStephan T. Lavavej static_assert(!std::integral<T*>); 38*df9167bfSStephan T. Lavavej static_assert(!std::integral<const T*>); 39*df9167bfSStephan T. Lavavej static_assert(!std::integral<volatile T*>); 40*df9167bfSStephan T. Lavavej static_assert(!std::integral<const volatile T*>); 41*df9167bfSStephan T. Lavavej 42*df9167bfSStephan T. Lavavej static_assert(!std::integral<T (*)()>); 43*df9167bfSStephan T. Lavavej static_assert(!std::integral<T (&)()>); 44*df9167bfSStephan T. Lavavej static_assert(!std::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 signed and unsigned integers 50*df9167bfSStephan T. Lavavej static_assert(CheckIntegralQualifiers<signed char>()); 51*df9167bfSStephan T. Lavavej static_assert(CheckIntegralQualifiers<unsigned char>()); 52*df9167bfSStephan T. Lavavej static_assert(CheckIntegralQualifiers<short>()); 53*df9167bfSStephan T. Lavavej static_assert(CheckIntegralQualifiers<unsigned short>()); 54*df9167bfSStephan T. Lavavej static_assert(CheckIntegralQualifiers<int>()); 55*df9167bfSStephan T. Lavavej static_assert(CheckIntegralQualifiers<unsigned int>()); 56*df9167bfSStephan T. Lavavej static_assert(CheckIntegralQualifiers<long>()); 57*df9167bfSStephan T. Lavavej static_assert(CheckIntegralQualifiers<unsigned long>()); 58*df9167bfSStephan T. Lavavej static_assert(CheckIntegralQualifiers<long long>()); 59*df9167bfSStephan T. Lavavej static_assert(CheckIntegralQualifiers<unsigned long long>()); 60*df9167bfSStephan T. Lavavej 61*df9167bfSStephan T. Lavavej // extended integers 62*df9167bfSStephan T. Lavavej #ifndef TEST_HAS_NO_INT128 63*df9167bfSStephan T. Lavavej static_assert(CheckIntegralQualifiers<__int128_t>()); 64*df9167bfSStephan T. Lavavej static_assert(CheckIntegralQualifiers<__uint128_t>()); 65*df9167bfSStephan T. Lavavej #endif 66*df9167bfSStephan T. Lavavej 67*df9167bfSStephan T. Lavavej // bool and char types are also integral 68*df9167bfSStephan T. Lavavej static_assert(CheckIntegralQualifiers<wchar_t>()); 69*df9167bfSStephan T. Lavavej static_assert(CheckIntegralQualifiers<bool>()); 70*df9167bfSStephan T. Lavavej static_assert(CheckIntegralQualifiers<char>()); 71*df9167bfSStephan T. Lavavej static_assert(CheckIntegralQualifiers<char8_t>()); 72*df9167bfSStephan T. Lavavej static_assert(CheckIntegralQualifiers<char16_t>()); 73*df9167bfSStephan T. Lavavej static_assert(CheckIntegralQualifiers<char32_t>()); 74*df9167bfSStephan T. Lavavej 75*df9167bfSStephan T. Lavavej // types that aren't integral 76*df9167bfSStephan T. Lavavej static_assert(!std::integral<void>); 77*df9167bfSStephan T. Lavavej static_assert(!CheckIntegralQualifiers<float>()); 78*df9167bfSStephan T. Lavavej static_assert(!CheckIntegralQualifiers<double>()); 79*df9167bfSStephan T. Lavavej static_assert(!CheckIntegralQualifiers<long double>()); 80*df9167bfSStephan T. Lavavej 81*df9167bfSStephan T. Lavavej static_assert(!CheckIntegralQualifiers<ClassicEnum>()); 82*df9167bfSStephan T. Lavavej 83*df9167bfSStephan T. Lavavej static_assert(!CheckIntegralQualifiers<ScopedEnum>()); 84*df9167bfSStephan T. Lavavej 85*df9167bfSStephan T. Lavavej static_assert(!CheckIntegralQualifiers<EmptyStruct>()); 86*df9167bfSStephan T. Lavavej static_assert(!CheckIntegralQualifiers<int EmptyStruct::*>()); 87*df9167bfSStephan T. Lavavej static_assert(!CheckIntegralQualifiers<int (EmptyStruct::*)()>()); 88*df9167bfSStephan T. Lavavej 89*df9167bfSStephan T. Lavavej static_assert(CheckSubsumption(0)); 90*df9167bfSStephan T. Lavavej static_assert(CheckSubsumption(0U)); 91