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. Lavavej constexpr 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