Skip to content

Commit 69761e7

Browse files
authored
[clang] [test] Verify that intrinsic headers don't use unreserved names (#161817)
This mirrors a similar test that libcxx does, to make sure that the libcxx headers don't use any unreserved symbols. The header for polluting with defines is based very far on the libcxx one; some parts of it could possibly be omitted, but I included most of it for completeness here. This should allow catching these issues earlier, to avoid issues like #161808 and #98478 happening again.
1 parent a13ff2c commit 69761e7

File tree

8 files changed

+179
-0
lines changed

8 files changed

+179
-0
lines changed

clang/test/Headers/arm-acle-header.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
// RUN: %clang_cc1 -x c++ -triple arm64ec-windows -target-cpu cortex-a53 -fsyntax-only -ffreestanding -fms-extensions -fms-compatibility -fms-compatibility-version=19.11 %s
1111
// expected-no-diagnostics
1212

13+
#include "system_reserved_names.h"
14+
1315
#include <arm_acle.h>
1416
#ifdef _MSC_VER
1517
#include <intrin.h>

clang/test/Headers/arm-cde-header.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,7 @@
99

1010
// Check that the headers don't conflict with each other
1111

12+
#include "system_reserved_names.h"
13+
1214
#include <arm_cde.h>
1315
#include <arm_mve.h>

clang/test/Headers/arm-cmse-header.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
// RUN: %clang_cc1 -triple thumbv8m.base-eabi -fsyntax-only -ffreestanding -x c++ %s -verify -mcmse
33
// expected-no-diagnostics
44

5+
#include "system_reserved_names.h"
6+
57
#include <arm_cmse.h>
68

79
typedef void (*callback_t)(void);

clang/test/Headers/arm-fp16-header.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,6 @@
1818

1919
// REQUIRES: aarch64-registered-target || arm-registered-target
2020

21+
#include "system_reserved_names.h"
22+
2123
#include <arm_fp16.h>

clang/test/Headers/arm-neon-header.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,6 @@
2626

2727
// REQUIRES: aarch64-registered-target || arm-registered-target
2828

29+
#include "system_reserved_names.h"
30+
2931
#include <arm_neon.h>
Lines changed: 165 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,165 @@
1+
// Test that headers are not tripped up by the surrounding code defining various
2+
// alphabetic macros. Also ensure that we don't swallow the definition of user
3+
// provided macros (in other words, ensure that we push/pop correctly everywhere).
4+
//
5+
// The contents of this header is a lightly trimmed version of
6+
// libcxx/test/libcxx/system_reserved_names.gen.py; additions to that testcase
7+
// can be synced into this header as well.
8+
9+
#define SYSTEM_RESERVED_NAME This name should not be used in Clang headers
10+
11+
// libc++ does not use single-letter names as a matter of principle.
12+
// But Windows' own <wchar.h>, <math.h>, and <exception> use many of these
13+
// (at least C,E,F,I,M,N,P,S,X,Y,Z) as uglified function parameter names,
14+
// so don't define these on Windows.
15+
//
16+
#ifndef _WIN32
17+
#define _A SYSTEM_RESERVED_NAME
18+
#define _B SYSTEM_RESERVED_NAME
19+
#define _C SYSTEM_RESERVED_NAME
20+
#define _D SYSTEM_RESERVED_NAME
21+
#define _E SYSTEM_RESERVED_NAME
22+
#define _F SYSTEM_RESERVED_NAME
23+
#define _G SYSTEM_RESERVED_NAME
24+
#define _H SYSTEM_RESERVED_NAME
25+
#define _I SYSTEM_RESERVED_NAME
26+
#define _J SYSTEM_RESERVED_NAME
27+
#define _K SYSTEM_RESERVED_NAME
28+
#define _L SYSTEM_RESERVED_NAME
29+
#define _M SYSTEM_RESERVED_NAME
30+
#define _N SYSTEM_RESERVED_NAME
31+
#define _O SYSTEM_RESERVED_NAME
32+
#define _P SYSTEM_RESERVED_NAME
33+
#define _Q SYSTEM_RESERVED_NAME
34+
#define _R SYSTEM_RESERVED_NAME
35+
#define _S SYSTEM_RESERVED_NAME
36+
#define _T SYSTEM_RESERVED_NAME
37+
#define _U SYSTEM_RESERVED_NAME
38+
#define _V SYSTEM_RESERVED_NAME
39+
#define _W SYSTEM_RESERVED_NAME
40+
#define _X SYSTEM_RESERVED_NAME
41+
#define _Y SYSTEM_RESERVED_NAME
42+
#define _Z SYSTEM_RESERVED_NAME
43+
#endif
44+
45+
// FreeBSD's <sys/types.h> uses _M
46+
//
47+
#ifdef __FreeBSD__
48+
# undef _M
49+
#endif
50+
51+
// Test that libc++ doesn't use names that collide with FreeBSD system macros.
52+
// newlib and picolibc also define these macros
53+
#if !defined(__FreeBSD__) && !defined(_NEWLIB_VERSION)
54+
# define __null_sentinel SYSTEM_RESERVED_NAME
55+
# define __generic SYSTEM_RESERVED_NAME
56+
#endif
57+
58+
// tchar.h defines these macros on Windows
59+
#ifndef _WIN32
60+
# define _UI SYSTEM_RESERVED_NAME
61+
# define _PUC SYSTEM_RESERVED_NAME
62+
# define _CPUC SYSTEM_RESERVED_NAME
63+
# define _PC SYSTEM_RESERVED_NAME
64+
# define _CRPC SYSTEM_RESERVED_NAME
65+
# define _CPC SYSTEM_RESERVED_NAME
66+
#endif
67+
68+
// yvals.h on MINGW defines this macro
69+
#ifndef _WIN32
70+
# define _C2 SYSTEM_RESERVED_NAME
71+
#endif
72+
73+
// Test that libc++ doesn't use names that collide with Win32 API macros.
74+
// Obviously we can only define these on non-Windows platforms.
75+
#ifndef _WIN32
76+
# define __allocator SYSTEM_RESERVED_NAME
77+
# define __bound SYSTEM_RESERVED_NAME
78+
# define __deallocate SYSTEM_RESERVED_NAME
79+
# define __deref SYSTEM_RESERVED_NAME
80+
# define __format_string SYSTEM_RESERVED_NAME
81+
# define __full SYSTEM_RESERVED_NAME
82+
# define __in SYSTEM_RESERVED_NAME
83+
# define __inout SYSTEM_RESERVED_NAME
84+
# define __nz SYSTEM_RESERVED_NAME
85+
# define __out SYSTEM_RESERVED_NAME
86+
# define __part SYSTEM_RESERVED_NAME
87+
# define __post SYSTEM_RESERVED_NAME
88+
# define __pre SYSTEM_RESERVED_NAME
89+
#endif
90+
91+
// Newlib & picolibc use __input as a parameter name of a64l & l64a
92+
#ifndef _NEWLIB_VERSION
93+
# define __input SYSTEM_RESERVED_NAME
94+
#endif
95+
#define __output SYSTEM_RESERVED_NAME
96+
97+
#define __acquire SYSTEM_RESERVED_NAME
98+
#define __release SYSTEM_RESERVED_NAME
99+
100+
// Android and FreeBSD use this for __attribute__((__unused__))
101+
#if !defined(__FreeBSD__) && !defined(__ANDROID__)
102+
#define __unused SYSTEM_RESERVED_NAME
103+
#endif
104+
105+
// These names are not reserved, so the user can macro-define them.
106+
// These are intended to find improperly _Uglified template parameters.
107+
#define A SYSTEM_RESERVED_NAME
108+
#define Arg SYSTEM_RESERVED_NAME
109+
#define Args SYSTEM_RESERVED_NAME
110+
#define As SYSTEM_RESERVED_NAME
111+
#define B SYSTEM_RESERVED_NAME
112+
#define Bs SYSTEM_RESERVED_NAME
113+
#define C SYSTEM_RESERVED_NAME
114+
#define Cp SYSTEM_RESERVED_NAME
115+
#define Cs SYSTEM_RESERVED_NAME
116+
// Windows setjmp.h contains a struct member named 'D' on ARM/AArch64.
117+
#ifndef _WIN32
118+
# define D SYSTEM_RESERVED_NAME
119+
#endif
120+
#define Dp SYSTEM_RESERVED_NAME
121+
#define Ds SYSTEM_RESERVED_NAME
122+
#define E SYSTEM_RESERVED_NAME
123+
#define Ep SYSTEM_RESERVED_NAME
124+
#define Es SYSTEM_RESERVED_NAME
125+
#define N SYSTEM_RESERVED_NAME
126+
#define Np SYSTEM_RESERVED_NAME
127+
#define Ns SYSTEM_RESERVED_NAME
128+
#define R SYSTEM_RESERVED_NAME
129+
#define Rp SYSTEM_RESERVED_NAME
130+
#define Rs SYSTEM_RESERVED_NAME
131+
#define T SYSTEM_RESERVED_NAME
132+
#define Tp SYSTEM_RESERVED_NAME
133+
#define Ts SYSTEM_RESERVED_NAME
134+
#define Type SYSTEM_RESERVED_NAME
135+
#define Types SYSTEM_RESERVED_NAME
136+
#define U SYSTEM_RESERVED_NAME
137+
#define Up SYSTEM_RESERVED_NAME
138+
#define Us SYSTEM_RESERVED_NAME
139+
#define V SYSTEM_RESERVED_NAME
140+
#define Vp SYSTEM_RESERVED_NAME
141+
#define Vs SYSTEM_RESERVED_NAME
142+
#define X SYSTEM_RESERVED_NAME
143+
#define Xp SYSTEM_RESERVED_NAME
144+
#define Xs SYSTEM_RESERVED_NAME
145+
146+
// The classic Windows min/max macros
147+
#define min SYSTEM_RESERVED_NAME
148+
#define max SYSTEM_RESERVED_NAME
149+
150+
// Test to make sure curses has no conflicting macros with the standard library
151+
#define move SYSTEM_RESERVED_NAME
152+
#define erase SYSTEM_RESERVED_NAME
153+
#define refresh SYSTEM_RESERVED_NAME
154+
155+
// Dinkumware libc ctype.h uses these definitions
156+
#define _XA SYSTEM_RESERVED_NAME
157+
#define _XS SYSTEM_RESERVED_NAME
158+
#define _BB SYSTEM_RESERVED_NAME
159+
#define _CN SYSTEM_RESERVED_NAME
160+
#define _DI SYSTEM_RESERVED_NAME
161+
#define _LO SYSTEM_RESERVED_NAME
162+
#define _PU SYSTEM_RESERVED_NAME
163+
#define _SP SYSTEM_RESERVED_NAME
164+
#define _UP SYSTEM_RESERVED_NAME
165+
#define _XD SYSTEM_RESERVED_NAME

clang/test/Headers/x86-intrinsics-headers-clean.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,6 @@
1010

1111
// expected-no-diagnostics
1212

13+
#include "system_reserved_names.h"
14+
1315
#include <x86intrin.h>

clang/test/Headers/x86-intrinsics-headers.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
// XFAIL: target=arm64ec-pc-windows-msvc
66
// These intrinsics are not yet implemented for Arm64EC.
77

8+
#include "system_reserved_names.h"
9+
810
#if defined(i386) || defined(__x86_64__)
911

1012
#ifdef __SSE4_2__

0 commit comments

Comments
 (0)