• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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# RUN: %{python} %s %{libcxx}/utils
13
14import sys
15sys.path.append(sys.argv[1])
16from libcxx.header_information import lit_header_restrictions, public_headers
17
18for header in public_headers:
19  print(f"""\
20//--- {header}.compile.pass.cpp
21{lit_header_restrictions.get(header, '')}
22
23#define SYSTEM_RESERVED_NAME This name should not be used in libc++
24
25// libc++ does not use single-letter names as a matter of principle.
26// But Windows' own <wchar.h>, <math.h>, and <exception> use many of these
27// (at least C,E,F,I,M,N,P,S,X,Y,Z) as uglified function parameter names,
28// so don't define these on Windows.
29//
30#ifndef _WIN32
31#define _A SYSTEM_RESERVED_NAME
32#define _B SYSTEM_RESERVED_NAME
33#define _C SYSTEM_RESERVED_NAME
34#define _D SYSTEM_RESERVED_NAME
35#define _E SYSTEM_RESERVED_NAME
36#define _F SYSTEM_RESERVED_NAME
37#define _G SYSTEM_RESERVED_NAME
38#define _H SYSTEM_RESERVED_NAME
39#define _I SYSTEM_RESERVED_NAME
40#define _J SYSTEM_RESERVED_NAME
41#define _K SYSTEM_RESERVED_NAME
42#define _L SYSTEM_RESERVED_NAME
43#define _M SYSTEM_RESERVED_NAME
44#define _N SYSTEM_RESERVED_NAME
45#define _O SYSTEM_RESERVED_NAME
46#define _P SYSTEM_RESERVED_NAME
47#define _Q SYSTEM_RESERVED_NAME
48#define _R SYSTEM_RESERVED_NAME
49#define _S SYSTEM_RESERVED_NAME
50#define _T SYSTEM_RESERVED_NAME
51#define _U SYSTEM_RESERVED_NAME
52#define _V SYSTEM_RESERVED_NAME
53#define _W SYSTEM_RESERVED_NAME
54#define _X SYSTEM_RESERVED_NAME
55#define _Y SYSTEM_RESERVED_NAME
56#define _Z SYSTEM_RESERVED_NAME
57#endif
58
59// FreeBSD's <sys/types.h> uses _M
60//
61#ifdef __FreeBSD__
62# undef _M
63#endif
64
65// Test that libc++ doesn't use names that collide with FreeBSD system macros.
66// newlib and picolibc also define these macros
67#if !defined(__FreeBSD__) && !defined(_NEWLIB_VERSION)
68#  define __null_sentinel SYSTEM_RESERVED_NAME
69#  define __generic SYSTEM_RESERVED_NAME
70#endif
71
72// tchar.h defines these macros on Windows
73#ifndef _WIN32
74# define _UI   SYSTEM_RESERVED_NAME
75# define _PUC  SYSTEM_RESERVED_NAME
76# define _CPUC SYSTEM_RESERVED_NAME
77# define _PC   SYSTEM_RESERVED_NAME
78# define _CRPC SYSTEM_RESERVED_NAME
79# define _CPC  SYSTEM_RESERVED_NAME
80#endif
81
82// yvals.h on MINGW defines this macro
83#ifndef _WIN32
84# define _C2 SYSTEM_RESERVED_NAME
85#endif
86
87// Test that libc++ doesn't use names that collide with Win32 API macros.
88// Obviously we can only define these on non-Windows platforms.
89#ifndef _WIN32
90# define __allocator SYSTEM_RESERVED_NAME
91# define __bound SYSTEM_RESERVED_NAME
92# define __deallocate SYSTEM_RESERVED_NAME
93# define __deref SYSTEM_RESERVED_NAME
94# define __format_string SYSTEM_RESERVED_NAME
95# define __full SYSTEM_RESERVED_NAME
96# define __in SYSTEM_RESERVED_NAME
97# define __inout SYSTEM_RESERVED_NAME
98# define __nz SYSTEM_RESERVED_NAME
99# define __out SYSTEM_RESERVED_NAME
100# define __part SYSTEM_RESERVED_NAME
101# define __post SYSTEM_RESERVED_NAME
102# define __pre SYSTEM_RESERVED_NAME
103#endif
104
105// Newlib & picolibc use __input as a parameter name of a64l & l64a
106#ifndef _NEWLIB_VERSION
107# define __input SYSTEM_RESERVED_NAME
108#endif
109#define __output SYSTEM_RESERVED_NAME
110
111#define __acquire SYSTEM_RESERVED_NAME
112#define __release SYSTEM_RESERVED_NAME
113
114// These names are not reserved, so the user can macro-define them.
115// These are intended to find improperly _Uglified template parameters.
116#define A SYSTEM_RESERVED_NAME
117#define Arg SYSTEM_RESERVED_NAME
118#define Args SYSTEM_RESERVED_NAME
119#define As SYSTEM_RESERVED_NAME
120#define B SYSTEM_RESERVED_NAME
121#define Bs SYSTEM_RESERVED_NAME
122#define C SYSTEM_RESERVED_NAME
123#define Cp SYSTEM_RESERVED_NAME
124#define Cs SYSTEM_RESERVED_NAME
125// Windows setjmp.h contains a struct member named 'D' on ARM/AArch64.
126#ifndef _WIN32
127# define D SYSTEM_RESERVED_NAME
128#endif
129#define Dp SYSTEM_RESERVED_NAME
130#define Ds SYSTEM_RESERVED_NAME
131#define E SYSTEM_RESERVED_NAME
132#define Ep SYSTEM_RESERVED_NAME
133#define Es SYSTEM_RESERVED_NAME
134#define R SYSTEM_RESERVED_NAME
135#define Rp SYSTEM_RESERVED_NAME
136#define Rs SYSTEM_RESERVED_NAME
137#define T SYSTEM_RESERVED_NAME
138#define Tp SYSTEM_RESERVED_NAME
139#define Ts SYSTEM_RESERVED_NAME
140#define Type SYSTEM_RESERVED_NAME
141#define Types SYSTEM_RESERVED_NAME
142#define U SYSTEM_RESERVED_NAME
143#define Up SYSTEM_RESERVED_NAME
144#define Us SYSTEM_RESERVED_NAME
145#define V SYSTEM_RESERVED_NAME
146#define Vp SYSTEM_RESERVED_NAME
147#define Vs SYSTEM_RESERVED_NAME
148#define X SYSTEM_RESERVED_NAME
149#define Xp SYSTEM_RESERVED_NAME
150#define Xs SYSTEM_RESERVED_NAME
151
152// The classic Windows min/max macros
153#define min SYSTEM_RESERVED_NAME
154#define max SYSTEM_RESERVED_NAME
155
156// Test to make sure curses has no conflicting macros with the standard library
157#define move SYSTEM_RESERVED_NAME
158#define erase SYSTEM_RESERVED_NAME
159#define refresh SYSTEM_RESERVED_NAME
160
161#include <{header}>
162""")
163