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 // Test that headers are not tripped up by the surrounding code defining various
10 // alphabetic macros.
11 
12 // The system-provided <uchar.h> seems to be broken on AIX
13 // XFAIL: LIBCXX-AIX-FIXME
14 
15 // Prevent <ext/hash_map> from generating deprecated warnings for this test.
16 #if defined(__DEPRECATED)
17 #    undef __DEPRECATED
18 #endif
19 
20 #define NASTY_MACRO This should not be expanded!!!
21 
22 // libc++ does not use single-letter names as a matter of principle.
23 // But Windows' own <wchar.h>, <math.h>, and <exception> use many of these
24 // (at least C,E,F,I,M,N,P,S,X,Y,Z) as uglified function parameter names,
25 // so don't define these on Windows.
26 //
27 #ifndef _WIN32
28 #define _A NASTY_MACRO
29 #define _B NASTY_MACRO
30 #define _C NASTY_MACRO
31 #define _D NASTY_MACRO
32 #define _E NASTY_MACRO
33 #define _F NASTY_MACRO
34 #define _G NASTY_MACRO
35 #define _H NASTY_MACRO
36 #define _I NASTY_MACRO
37 #define _J NASTY_MACRO
38 #define _K NASTY_MACRO
39 #define _L NASTY_MACRO
40 #define _M NASTY_MACRO
41 #define _N NASTY_MACRO
42 #define _O NASTY_MACRO
43 #define _P NASTY_MACRO
44 #define _Q NASTY_MACRO
45 #define _R NASTY_MACRO
46 #define _S NASTY_MACRO
47 #define _T NASTY_MACRO
48 #define _U NASTY_MACRO
49 #define _V NASTY_MACRO
50 #define _W NASTY_MACRO
51 #define _X NASTY_MACRO
52 #define _Y NASTY_MACRO
53 #define _Z NASTY_MACRO
54 #endif
55 
56 // FreeBSD's <sys/types.h> uses _M
57 //
58 #ifdef __FreeBSD__
59 # undef _M
60 #endif
61 
62 // tchar.h defines these macros on Windows
63 #ifndef _WIN32
64 # define _UI   NASTY_MACRO
65 # define _PUC  NASTY_MACRO
66 # define _CPUC NASTY_MACRO
67 # define _PC   NASTY_MACRO
68 # define _CRPC NASTY_MACRO
69 # define _CPC  NASTY_MACRO
70 #endif
71 
72 // yvals.h on MINGW defines this macro
73 #ifndef _WIN32
74 # define _C2 NASTY_MACRO
75 #endif
76 
77 // Test that libc++ doesn't use names that collide with Win32 API macros.
78 // Obviously we can only define these on non-Windows platforms.
79 #ifndef _WIN32
80 # define __allocator NASTY_MACRO
81 # define __bound NASTY_MACRO
82 # define __deallocate NASTY_MACRO
83 # define __deref NASTY_MACRO
84 # define __format_string NASTY_MACRO
85 # define __full NASTY_MACRO
86 # define __in NASTY_MACRO
87 # define __inout NASTY_MACRO
88 # define __nz NASTY_MACRO
89 # define __out NASTY_MACRO
90 # define __part NASTY_MACRO
91 # define __post NASTY_MACRO
92 # define __pre NASTY_MACRO
93 #endif
94 
95 #define __input NASTY_MACRO
96 #define __output NASTY_MACRO
97 
98 #define __acquire NASTY_MACRO
99 #define __release NASTY_MACRO
100 
101 // These names are not reserved, so the user can macro-define them.
102 // These are intended to find improperly _Uglified template parameters.
103 #define A NASTY_MACRO
104 #define Arg NASTY_MACRO
105 #define Args NASTY_MACRO
106 #define As NASTY_MACRO
107 #define B NASTY_MACRO
108 #define Bs NASTY_MACRO
109 #define C NASTY_MACRO
110 #define Cp NASTY_MACRO
111 #define Cs NASTY_MACRO
112 // Windows setjmp.h contains a struct member named 'D' on ARM/AArch64.
113 #ifndef _WIN32
114 # define D NASTY_MACRO
115 #endif
116 #define Dp NASTY_MACRO
117 #define Ds NASTY_MACRO
118 #define E NASTY_MACRO
119 #define Ep NASTY_MACRO
120 #define Es NASTY_MACRO
121 #define R NASTY_MACRO
122 #define Rp NASTY_MACRO
123 #define Rs NASTY_MACRO
124 #define T NASTY_MACRO
125 #define Tp NASTY_MACRO
126 #define Ts NASTY_MACRO
127 #define Type NASTY_MACRO
128 #define Types NASTY_MACRO
129 #define U NASTY_MACRO
130 #define Up NASTY_MACRO
131 #define Us NASTY_MACRO
132 #define V NASTY_MACRO
133 #define Vp NASTY_MACRO
134 #define Vs NASTY_MACRO
135 #define X NASTY_MACRO
136 #define Xp NASTY_MACRO
137 #define Xs NASTY_MACRO
138 
139 // The classic Windows min/max macros
140 #define min NASTY_MACRO
141 #define max NASTY_MACRO
142 
143 /*
144 BEGIN-SCRIPT
145 
146 for header in public_headers:
147   print("{}#{}include <{}>{}".format(
148     '#if ' + header_restrictions[header] + '\n' if header in header_restrictions else '',
149     3 * ' ' if header in header_restrictions else '',
150     header,
151     '\n#endif' if header in header_restrictions else ''
152   ))
153 
154 END-SCRIPT
155 */
156 
157 // DO NOT MANUALLY EDIT ANYTHING BETWEEN THE MARKERS BELOW
158 // GENERATED-MARKER
159 #include <algorithm>
160 #include <any>
161 #include <array>
162 #include <atomic>
163 #if !defined(_LIBCPP_HAS_NO_THREADS)
164 #   include <barrier>
165 #endif
166 #include <bit>
167 #include <bitset>
168 #include <cassert>
169 #include <ccomplex>
170 #include <cctype>
171 #include <cerrno>
172 #include <cfenv>
173 #include <cfloat>
174 #include <charconv>
175 #include <chrono>
176 #include <cinttypes>
177 #include <ciso646>
178 #include <climits>
179 #if !defined(_LIBCPP_HAS_NO_LOCALIZATION)
180 #   include <clocale>
181 #endif
182 #include <cmath>
183 #if !defined(_LIBCPP_HAS_NO_LOCALIZATION)
184 #   include <codecvt>
185 #endif
186 #include <compare>
187 #include <complex>
188 #include <complex.h>
189 #include <concepts>
190 #include <condition_variable>
191 #include <coroutine>
192 #include <csetjmp>
193 #include <csignal>
194 #include <cstdarg>
195 #include <cstdbool>
196 #include <cstddef>
197 #include <cstdint>
198 #include <cstdio>
199 #include <cstdlib>
200 #include <cstring>
201 #include <ctgmath>
202 #include <ctime>
203 #include <ctype.h>
204 #include <cuchar>
205 #if !defined(_LIBCPP_HAS_NO_WIDE_CHARACTERS)
206 #   include <cwchar>
207 #endif
208 #if !defined(_LIBCPP_HAS_NO_WIDE_CHARACTERS)
209 #   include <cwctype>
210 #endif
211 #include <deque>
212 #include <errno.h>
213 #include <exception>
214 #include <execution>
215 #include <fenv.h>
216 #if !defined(_LIBCPP_HAS_NO_FILESYSTEM_LIBRARY)
217 #   include <filesystem>
218 #endif
219 #include <float.h>
220 #include <format>
221 #include <forward_list>
222 #if !defined(_LIBCPP_HAS_NO_LOCALIZATION)
223 #   include <fstream>
224 #endif
225 #include <functional>
226 #if !defined(_LIBCPP_HAS_NO_THREADS)
227 #   include <future>
228 #endif
229 #include <initializer_list>
230 #include <inttypes.h>
231 #if !defined(_LIBCPP_HAS_NO_LOCALIZATION)
232 #   include <iomanip>
233 #endif
234 #if !defined(_LIBCPP_HAS_NO_LOCALIZATION)
235 #   include <ios>
236 #endif
237 #include <iosfwd>
238 #if !defined(_LIBCPP_HAS_NO_LOCALIZATION)
239 #   include <iostream>
240 #endif
241 #if !defined(_LIBCPP_HAS_NO_LOCALIZATION)
242 #   include <istream>
243 #endif
244 #include <iterator>
245 #if !defined(_LIBCPP_HAS_NO_THREADS)
246 #   include <latch>
247 #endif
248 #include <limits>
249 #include <limits.h>
250 #include <list>
251 #if !defined(_LIBCPP_HAS_NO_LOCALIZATION)
252 #   include <locale>
253 #endif
254 #if !defined(_LIBCPP_HAS_NO_LOCALIZATION)
255 #   include <locale.h>
256 #endif
257 #include <map>
258 #include <math.h>
259 #include <memory>
260 #if !defined(_LIBCPP_HAS_NO_THREADS)
261 #   include <mutex>
262 #endif
263 #include <new>
264 #include <numbers>
265 #include <numeric>
266 #include <optional>
267 #if !defined(_LIBCPP_HAS_NO_LOCALIZATION)
268 #   include <ostream>
269 #endif
270 #include <queue>
271 #include <random>
272 #include <ranges>
273 #include <ratio>
274 #if !defined(_LIBCPP_HAS_NO_LOCALIZATION)
275 #   include <regex>
276 #endif
277 #include <scoped_allocator>
278 #if !defined(_LIBCPP_HAS_NO_THREADS)
279 #   include <semaphore>
280 #endif
281 #include <set>
282 #include <setjmp.h>
283 #if !defined(_LIBCPP_HAS_NO_THREADS)
284 #   include <shared_mutex>
285 #endif
286 #include <span>
287 #if !defined(_LIBCPP_HAS_NO_LOCALIZATION)
288 #   include <sstream>
289 #endif
290 #include <stack>
291 #if __cplusplus > 202002L && !defined(_LIBCPP_HAS_NO_THREADS)
292 #   include <stdatomic.h>
293 #endif
294 #include <stdbool.h>
295 #include <stddef.h>
296 #include <stdexcept>
297 #include <stdint.h>
298 #include <stdio.h>
299 #include <stdlib.h>
300 #if !defined(_LIBCPP_HAS_NO_LOCALIZATION)
301 #   include <streambuf>
302 #endif
303 #include <string>
304 #include <string.h>
305 #include <string_view>
306 #if !defined(_LIBCPP_HAS_NO_LOCALIZATION)
307 #   include <strstream>
308 #endif
309 #include <system_error>
310 #include <tgmath.h>
311 #if !defined(_LIBCPP_HAS_NO_THREADS)
312 #   include <thread>
313 #endif
314 #include <tuple>
315 #include <type_traits>
316 #include <typeindex>
317 #include <typeinfo>
318 #include <uchar.h>
319 #include <unordered_map>
320 #include <unordered_set>
321 #include <utility>
322 #include <valarray>
323 #include <variant>
324 #include <vector>
325 #include <version>
326 #if !defined(_LIBCPP_HAS_NO_WIDE_CHARACTERS)
327 #   include <wchar.h>
328 #endif
329 #if !defined(_LIBCPP_HAS_NO_WIDE_CHARACTERS)
330 #   include <wctype.h>
331 #endif
332 #if __cplusplus >= 201103L
333 #   include <experimental/algorithm>
334 #endif
335 #if __cplusplus >= 201103L && !defined(_LIBCPP_HAS_NO_EXPERIMENTAL_COROUTINES)
336 #   include <experimental/coroutine>
337 #endif
338 #if __cplusplus >= 201103L
339 #   include <experimental/deque>
340 #endif
341 #if __cplusplus >= 201103L
342 #   include <experimental/forward_list>
343 #endif
344 #if __cplusplus >= 201103L
345 #   include <experimental/functional>
346 #endif
347 #if __cplusplus >= 201103L
348 #   include <experimental/iterator>
349 #endif
350 #if __cplusplus >= 201103L
351 #   include <experimental/list>
352 #endif
353 #if __cplusplus >= 201103L
354 #   include <experimental/map>
355 #endif
356 #if __cplusplus >= 201103L
357 #   include <experimental/memory_resource>
358 #endif
359 #if __cplusplus >= 201103L
360 #   include <experimental/propagate_const>
361 #endif
362 #if !defined(_LIBCPP_HAS_NO_LOCALIZATION) && __cplusplus >= 201103L
363 #   include <experimental/regex>
364 #endif
365 #if __cplusplus >= 201103L
366 #   include <experimental/set>
367 #endif
368 #if __cplusplus >= 201103L
369 #   include <experimental/simd>
370 #endif
371 #if __cplusplus >= 201103L
372 #   include <experimental/string>
373 #endif
374 #if __cplusplus >= 201103L
375 #   include <experimental/type_traits>
376 #endif
377 #if __cplusplus >= 201103L
378 #   include <experimental/unordered_map>
379 #endif
380 #if __cplusplus >= 201103L
381 #   include <experimental/unordered_set>
382 #endif
383 #if __cplusplus >= 201103L
384 #   include <experimental/utility>
385 #endif
386 #if __cplusplus >= 201103L
387 #   include <experimental/vector>
388 #endif
389 #include <ext/hash_map>
390 #include <ext/hash_set>
391 // GENERATED-MARKER
392