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 // ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS
10 
11 #include <limits>
12 
13 #include "test_macros.h"
14 
15 /*
16 <limits>:
17     numeric_limits
18         is_specialized
19         digits
20         digits10
21         max_digits10
22         is_signed
23         is_integer
24         is_exact
25         radix
26         min_exponent
27         min_exponent10
28         max_exponent
29         max_exponent10
30         has_infinity
31         has_quiet_NaN
32         has_signaling_NaN
33         has_denorm
34         has_denorm_loss
35         is_iec559
36         is_bounded
37         is_modulo
38         traps
39         tinyness_before
40         round_style
41 */
42 
43 template <class T>
test(const T &)44 void test(const T &) {}
45 
46 #define TEST_NUMERIC_LIMITS(type) \
47   test(std::numeric_limits<type>::is_specialized); \
48   test(std::numeric_limits<type>::digits); \
49   test(std::numeric_limits<type>::digits10); \
50   test(std::numeric_limits<type>::max_digits10); \
51   test(std::numeric_limits<type>::is_signed); \
52   test(std::numeric_limits<type>::is_integer); \
53   test(std::numeric_limits<type>::is_exact); \
54   test(std::numeric_limits<type>::radix); \
55   test(std::numeric_limits<type>::min_exponent); \
56   test(std::numeric_limits<type>::min_exponent10); \
57   test(std::numeric_limits<type>::max_exponent); \
58   test(std::numeric_limits<type>::max_exponent10); \
59   test(std::numeric_limits<type>::has_infinity); \
60   test(std::numeric_limits<type>::has_quiet_NaN); \
61   test(std::numeric_limits<type>::has_signaling_NaN); \
62   test(std::numeric_limits<type>::has_denorm); \
63   test(std::numeric_limits<type>::has_denorm_loss); \
64   test(std::numeric_limits<type>::is_iec559); \
65   test(std::numeric_limits<type>::is_bounded); \
66   test(std::numeric_limits<type>::is_modulo); \
67   test(std::numeric_limits<type>::traps); \
68   test(std::numeric_limits<type>::tinyness_before); \
69   test(std::numeric_limits<type>::round_style);
70 
71 struct other {};
72 
main(int,char **)73 int main(int, char**)
74 {
75     // bool
76     TEST_NUMERIC_LIMITS(bool)
77     TEST_NUMERIC_LIMITS(const bool)
78     TEST_NUMERIC_LIMITS(volatile bool)
79     TEST_NUMERIC_LIMITS(const volatile bool)
80 
81     // char
82     TEST_NUMERIC_LIMITS(char)
83     TEST_NUMERIC_LIMITS(const char)
84     TEST_NUMERIC_LIMITS(volatile char)
85     TEST_NUMERIC_LIMITS(const volatile char)
86 
87     // signed char
88     TEST_NUMERIC_LIMITS(signed char)
89     TEST_NUMERIC_LIMITS(const signed char)
90     TEST_NUMERIC_LIMITS(volatile signed char)
91     TEST_NUMERIC_LIMITS(const volatile signed char)
92 
93     // unsigned char
94     TEST_NUMERIC_LIMITS(unsigned char)
95     TEST_NUMERIC_LIMITS(const unsigned char)
96     TEST_NUMERIC_LIMITS(volatile unsigned char)
97     TEST_NUMERIC_LIMITS(const volatile unsigned char)
98 
99     // wchar_t
100     TEST_NUMERIC_LIMITS(wchar_t)
101     TEST_NUMERIC_LIMITS(const wchar_t)
102     TEST_NUMERIC_LIMITS(volatile wchar_t)
103     TEST_NUMERIC_LIMITS(const volatile wchar_t)
104 
105 #if TEST_STD_VER > 17 && defined(__cpp_char8_t)
106     // char8_t
107     TEST_NUMERIC_LIMITS(char8_t)
108     TEST_NUMERIC_LIMITS(const char8_t)
109     TEST_NUMERIC_LIMITS(volatile char8_t)
110     TEST_NUMERIC_LIMITS(const volatile char8_t)
111 #endif
112 
113     // char16_t
114     TEST_NUMERIC_LIMITS(char16_t)
115     TEST_NUMERIC_LIMITS(const char16_t)
116     TEST_NUMERIC_LIMITS(volatile char16_t)
117     TEST_NUMERIC_LIMITS(const volatile char16_t)
118 
119     // char32_t
120     TEST_NUMERIC_LIMITS(char32_t)
121     TEST_NUMERIC_LIMITS(const char32_t)
122     TEST_NUMERIC_LIMITS(volatile char32_t)
123     TEST_NUMERIC_LIMITS(const volatile char32_t)
124 
125     // short
126     TEST_NUMERIC_LIMITS(short)
127     TEST_NUMERIC_LIMITS(const short)
128     TEST_NUMERIC_LIMITS(volatile short)
129     TEST_NUMERIC_LIMITS(const volatile short)
130 
131     // int
132     TEST_NUMERIC_LIMITS(int)
133     TEST_NUMERIC_LIMITS(const int)
134     TEST_NUMERIC_LIMITS(volatile int)
135     TEST_NUMERIC_LIMITS(const volatile int)
136 
137     // long
138     TEST_NUMERIC_LIMITS(long)
139     TEST_NUMERIC_LIMITS(const long)
140     TEST_NUMERIC_LIMITS(volatile long)
141     TEST_NUMERIC_LIMITS(const volatile long)
142 
143 #ifndef TEST_HAS_NO_INT128
144     TEST_NUMERIC_LIMITS(__int128_t)
145     TEST_NUMERIC_LIMITS(const __int128_t)
146     TEST_NUMERIC_LIMITS(volatile __int128_t)
147     TEST_NUMERIC_LIMITS(const volatile __int128_t)
148 #endif
149 
150     // long long
151     TEST_NUMERIC_LIMITS(long long)
152     TEST_NUMERIC_LIMITS(const long long)
153     TEST_NUMERIC_LIMITS(volatile long long)
154     TEST_NUMERIC_LIMITS(const volatile long long)
155 
156     // unsigned short
157     TEST_NUMERIC_LIMITS(unsigned short)
158     TEST_NUMERIC_LIMITS(const unsigned short)
159     TEST_NUMERIC_LIMITS(volatile unsigned short)
160     TEST_NUMERIC_LIMITS(const volatile unsigned short)
161 
162     // unsigned int
163     TEST_NUMERIC_LIMITS(unsigned int)
164     TEST_NUMERIC_LIMITS(const unsigned int)
165     TEST_NUMERIC_LIMITS(volatile unsigned int)
166     TEST_NUMERIC_LIMITS(const volatile unsigned int)
167 
168     // unsigned long
169     TEST_NUMERIC_LIMITS(unsigned long)
170     TEST_NUMERIC_LIMITS(const unsigned long)
171     TEST_NUMERIC_LIMITS(volatile unsigned long)
172     TEST_NUMERIC_LIMITS(const volatile unsigned long)
173 
174     // unsigned long long
175     TEST_NUMERIC_LIMITS(unsigned long long)
176     TEST_NUMERIC_LIMITS(const unsigned long long)
177     TEST_NUMERIC_LIMITS(volatile unsigned long long)
178     TEST_NUMERIC_LIMITS(const volatile unsigned long long)
179 
180 #ifndef TEST_HAS_NO_INT128
181     TEST_NUMERIC_LIMITS(__uint128_t)
182     TEST_NUMERIC_LIMITS(const __uint128_t)
183     TEST_NUMERIC_LIMITS(volatile __uint128_t)
184     TEST_NUMERIC_LIMITS(const volatile __uint128_t)
185 #endif
186 
187     // float
188     TEST_NUMERIC_LIMITS(float)
189     TEST_NUMERIC_LIMITS(const float)
190     TEST_NUMERIC_LIMITS(volatile float)
191     TEST_NUMERIC_LIMITS(const volatile float)
192 
193     // double
194     TEST_NUMERIC_LIMITS(double)
195     TEST_NUMERIC_LIMITS(const double)
196     TEST_NUMERIC_LIMITS(volatile double)
197     TEST_NUMERIC_LIMITS(const volatile double)
198 
199     // long double
200     TEST_NUMERIC_LIMITS(long double)
201     TEST_NUMERIC_LIMITS(const long double)
202     TEST_NUMERIC_LIMITS(volatile long double)
203     TEST_NUMERIC_LIMITS(const volatile long double)
204 
205     // other
206     TEST_NUMERIC_LIMITS(other)
207     TEST_NUMERIC_LIMITS(const other)
208     TEST_NUMERIC_LIMITS(volatile other)
209     TEST_NUMERIC_LIMITS(const volatile other)
210 
211   return 0;
212 }
213