1//===----------------------------------------------------------------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is dual licensed under the MIT and the University of Illinois Open
6// Source Licenses. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include <limits>
11
12/*
13<limits>:
14    numeric_limits
15        is_specialized
16        digits
17        digits10
18        max_digits10
19        is_signed
20        is_integer
21        is_exact
22        radix
23        min_exponent
24        min_exponent10
25        max_exponent
26        max_exponent10
27        has_infinity
28        has_quiet_NaN
29        has_signaling_NaN
30        has_denorm
31        has_denorm_loss
32        is_iec559
33        is_bounded
34        is_modulo
35        traps
36        tinyness_before
37        round_style
38*/
39
40template <class _Tp>
41void test(const _Tp &) {}
42
43#define TEST_NUMERIC_LIMITS(type) \
44  test(std::numeric_limits<type>::is_specialized); \
45  test(std::numeric_limits<type>::digits); \
46  test(std::numeric_limits<type>::digits10); \
47  test(std::numeric_limits<type>::max_digits10); \
48  test(std::numeric_limits<type>::is_signed); \
49  test(std::numeric_limits<type>::is_integer); \
50  test(std::numeric_limits<type>::is_exact); \
51  test(std::numeric_limits<type>::radix); \
52  test(std::numeric_limits<type>::min_exponent); \
53  test(std::numeric_limits<type>::min_exponent10); \
54  test(std::numeric_limits<type>::max_exponent); \
55  test(std::numeric_limits<type>::max_exponent10); \
56  test(std::numeric_limits<type>::has_infinity); \
57  test(std::numeric_limits<type>::has_quiet_NaN); \
58  test(std::numeric_limits<type>::has_signaling_NaN); \
59  test(std::numeric_limits<type>::has_denorm); \
60  test(std::numeric_limits<type>::has_denorm_loss); \
61  test(std::numeric_limits<type>::is_iec559); \
62  test(std::numeric_limits<type>::is_bounded); \
63  test(std::numeric_limits<type>::is_modulo); \
64  test(std::numeric_limits<type>::traps); \
65  test(std::numeric_limits<type>::tinyness_before); \
66  test(std::numeric_limits<type>::round_style);
67
68struct other {};
69
70int main()
71{
72    // bool
73    TEST_NUMERIC_LIMITS(bool)
74    TEST_NUMERIC_LIMITS(const bool)
75    TEST_NUMERIC_LIMITS(volatile bool)
76    TEST_NUMERIC_LIMITS(const volatile bool)
77
78    // char
79    TEST_NUMERIC_LIMITS(char)
80    TEST_NUMERIC_LIMITS(const char)
81    TEST_NUMERIC_LIMITS(volatile char)
82    TEST_NUMERIC_LIMITS(const volatile char)
83
84    // signed char
85    TEST_NUMERIC_LIMITS(signed char)
86    TEST_NUMERIC_LIMITS(const signed char)
87    TEST_NUMERIC_LIMITS(volatile signed char)
88    TEST_NUMERIC_LIMITS(const volatile signed char)
89
90    // unsigned char
91    TEST_NUMERIC_LIMITS(unsigned char)
92    TEST_NUMERIC_LIMITS(const unsigned char)
93    TEST_NUMERIC_LIMITS(volatile unsigned char)
94    TEST_NUMERIC_LIMITS(const volatile unsigned char)
95
96    // wchar_t
97    TEST_NUMERIC_LIMITS(wchar_t)
98    TEST_NUMERIC_LIMITS(const wchar_t)
99    TEST_NUMERIC_LIMITS(volatile wchar_t)
100    TEST_NUMERIC_LIMITS(const volatile wchar_t)
101
102    // char16_t
103    TEST_NUMERIC_LIMITS(char16_t)
104    TEST_NUMERIC_LIMITS(const char16_t)
105    TEST_NUMERIC_LIMITS(volatile char16_t)
106    TEST_NUMERIC_LIMITS(const volatile char16_t)
107
108    // char32_t
109    TEST_NUMERIC_LIMITS(char32_t)
110    TEST_NUMERIC_LIMITS(const char32_t)
111    TEST_NUMERIC_LIMITS(volatile char32_t)
112    TEST_NUMERIC_LIMITS(const volatile char32_t)
113
114    // short
115    TEST_NUMERIC_LIMITS(short)
116    TEST_NUMERIC_LIMITS(const short)
117    TEST_NUMERIC_LIMITS(volatile short)
118    TEST_NUMERIC_LIMITS(const volatile short)
119
120    // int
121    TEST_NUMERIC_LIMITS(int)
122    TEST_NUMERIC_LIMITS(const int)
123    TEST_NUMERIC_LIMITS(volatile int)
124    TEST_NUMERIC_LIMITS(const volatile int)
125
126    // long
127    TEST_NUMERIC_LIMITS(long)
128    TEST_NUMERIC_LIMITS(const long)
129    TEST_NUMERIC_LIMITS(volatile long)
130    TEST_NUMERIC_LIMITS(const volatile long)
131
132#ifndef _LIBCPP_HAS_NO_INT128
133    TEST_NUMERIC_LIMITS(__int128_t)
134    TEST_NUMERIC_LIMITS(const __int128_t)
135    TEST_NUMERIC_LIMITS(volatile __int128_t)
136    TEST_NUMERIC_LIMITS(const volatile __int128_t)
137#endif
138
139    // long long
140    TEST_NUMERIC_LIMITS(long long)
141    TEST_NUMERIC_LIMITS(const long long)
142    TEST_NUMERIC_LIMITS(volatile long long)
143    TEST_NUMERIC_LIMITS(const volatile long long)
144
145    // unsigned short
146    TEST_NUMERIC_LIMITS(unsigned short)
147    TEST_NUMERIC_LIMITS(const unsigned short)
148    TEST_NUMERIC_LIMITS(volatile unsigned short)
149    TEST_NUMERIC_LIMITS(const volatile unsigned short)
150
151    // unsigned int
152    TEST_NUMERIC_LIMITS(unsigned int)
153    TEST_NUMERIC_LIMITS(const unsigned int)
154    TEST_NUMERIC_LIMITS(volatile unsigned int)
155    TEST_NUMERIC_LIMITS(const volatile unsigned int)
156
157    // unsigned long
158    TEST_NUMERIC_LIMITS(unsigned long)
159    TEST_NUMERIC_LIMITS(const unsigned long)
160    TEST_NUMERIC_LIMITS(volatile unsigned long)
161    TEST_NUMERIC_LIMITS(const volatile unsigned long)
162
163    // unsigned long long
164    TEST_NUMERIC_LIMITS(unsigned long long)
165    TEST_NUMERIC_LIMITS(const unsigned long long)
166    TEST_NUMERIC_LIMITS(volatile unsigned long long)
167    TEST_NUMERIC_LIMITS(const volatile unsigned long long)
168
169#ifndef _LIBCPP_HAS_NO_INT128
170    TEST_NUMERIC_LIMITS(__uint128_t)
171    TEST_NUMERIC_LIMITS(const __uint128_t)
172    TEST_NUMERIC_LIMITS(volatile __uint128_t)
173    TEST_NUMERIC_LIMITS(const volatile __uint128_t)
174#endif
175
176    // float
177    TEST_NUMERIC_LIMITS(float)
178    TEST_NUMERIC_LIMITS(const float)
179    TEST_NUMERIC_LIMITS(volatile float)
180    TEST_NUMERIC_LIMITS(const volatile float)
181
182    // double
183    TEST_NUMERIC_LIMITS(double)
184    TEST_NUMERIC_LIMITS(const double)
185    TEST_NUMERIC_LIMITS(volatile double)
186    TEST_NUMERIC_LIMITS(const volatile double)
187
188    // long double
189    TEST_NUMERIC_LIMITS(long double)
190    TEST_NUMERIC_LIMITS(const long double)
191    TEST_NUMERIC_LIMITS(volatile long double)
192    TEST_NUMERIC_LIMITS(const volatile long double)
193
194    // other
195    TEST_NUMERIC_LIMITS(other)
196    TEST_NUMERIC_LIMITS(const other)
197    TEST_NUMERIC_LIMITS(volatile other)
198    TEST_NUMERIC_LIMITS(const volatile other)
199}
200