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