Skip to content

Commit cbe22bc

Browse files
committed
[clang] [test] Verify that intrinsic headers don't use unreserved names
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.
1 parent 3c5c82d commit cbe22bc

File tree

8 files changed

+175
-0
lines changed

8 files changed

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