xref: /llvm-project/libcxx/test/std/utilities/meta/meta.unary/meta.unary.comp/is_arithmetic.pass.cpp (revision 64595f9b84fa77a130085260b1b4e26a2756dce8)
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 // type_traits
10 
11 // is_arithmetic
12 
13 #include <type_traits>
14 #include <cstddef>         // for std::nullptr_t
15 #include "test_macros.h"
16 
17 template <class T>
test_is_arithmetic()18 void test_is_arithmetic()
19 {
20     static_assert( std::is_arithmetic<T>::value, "");
21     static_assert( std::is_arithmetic<const T>::value, "");
22     static_assert( std::is_arithmetic<volatile T>::value, "");
23     static_assert( std::is_arithmetic<const volatile T>::value, "");
24 #if TEST_STD_VER > 14
25     static_assert( std::is_arithmetic_v<T>, "");
26     static_assert( std::is_arithmetic_v<const T>, "");
27     static_assert( std::is_arithmetic_v<volatile T>, "");
28     static_assert( std::is_arithmetic_v<const volatile T>, "");
29 #endif
30 }
31 
32 template <class T>
test_is_not_arithmetic()33 void test_is_not_arithmetic()
34 {
35     static_assert(!std::is_arithmetic<T>::value, "");
36     static_assert(!std::is_arithmetic<const T>::value, "");
37     static_assert(!std::is_arithmetic<volatile T>::value, "");
38     static_assert(!std::is_arithmetic<const volatile T>::value, "");
39 #if TEST_STD_VER > 14
40     static_assert(!std::is_arithmetic_v<T>, "");
41     static_assert(!std::is_arithmetic_v<const T>, "");
42     static_assert(!std::is_arithmetic_v<volatile T>, "");
43     static_assert(!std::is_arithmetic_v<const volatile T>, "");
44 #endif
45 }
46 
47 class incomplete_type;
48 
49 class Empty
50 {
51 };
52 
53 class NotEmpty
54 {
55     virtual ~NotEmpty();
56 };
57 
58 union Union {};
59 
60 struct bit_zero
61 {
62     int :  0;
63 };
64 
65 class Abstract
66 {
67     virtual ~Abstract() = 0;
68 };
69 
70 enum Enum {zero, one};
71 
72 enum EnumSigned : int { two };
73 
74 enum EnumUnsigned : unsigned { three };
75 
76 enum class EnumClass { zero, one };
77 
78 typedef void (*FunctionPtr)();
79 
80 
main(int,char **)81 int main(int, char**)
82 {
83     test_is_arithmetic<short>();
84     test_is_arithmetic<unsigned short>();
85     test_is_arithmetic<int>();
86     test_is_arithmetic<unsigned int>();
87     test_is_arithmetic<long>();
88     test_is_arithmetic<unsigned long>();
89     test_is_arithmetic<bool>();
90     test_is_arithmetic<char>();
91     test_is_arithmetic<signed char>();
92     test_is_arithmetic<unsigned char>();
93     test_is_arithmetic<wchar_t>();
94     test_is_arithmetic<double>();
95 
96     test_is_not_arithmetic<std::nullptr_t>();
97     test_is_not_arithmetic<void>();
98     test_is_not_arithmetic<int&>();
99     test_is_not_arithmetic<int&&>();
100     test_is_not_arithmetic<int*>();
101     test_is_not_arithmetic<const int*>();
102     test_is_not_arithmetic<char[3]>();
103     test_is_not_arithmetic<char[]>();
104     test_is_not_arithmetic<Union>();
105     test_is_not_arithmetic<Enum>();
106     test_is_not_arithmetic<EnumSigned>();
107     test_is_not_arithmetic<EnumUnsigned>();
108     test_is_not_arithmetic<EnumClass>();
109     test_is_not_arithmetic<FunctionPtr>();
110     test_is_not_arithmetic<Empty>();
111     test_is_not_arithmetic<incomplete_type>();
112     test_is_not_arithmetic<bit_zero>();
113     test_is_not_arithmetic<NotEmpty>();
114     test_is_not_arithmetic<Abstract>();
115 
116   return 0;
117 }
118