xref: /llvm-project/libcxx/test/std/concepts/concepts.lang/concepts.arithmetic/integral.compile.pass.cpp (revision df9167bfb3040bee492fd6bf64b97175f105da50)
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. Lavavej constexpr 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