205 lines · python
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-exception6#7# ===----------------------------------------------------------------------===##8 9# Test that headers are not tripped up by the surrounding code defining various10# alphabetic macros. Also ensure that we don't swallow the definition of user11# provided macros (in other words, ensure that we push/pop correctly everywhere).12 13# RUN: %{python} %s %{libcxx-dir}/utils14# END.15 16import sys17 18sys.path.append(sys.argv[1])19from libcxx.header_information import (20 lit_header_restrictions,21 lit_header_undeprecations,22 public_headers,23)24 25for header in public_headers:26 print(27 f"""\28//--- {header}.compile.pass.cpp29{lit_header_restrictions.get(header, '')}30{lit_header_undeprecations.get(header, '')}31 32// This is required to detect the platform we're building for below.33#include <__cxx03/__config>34 35#define SYSTEM_RESERVED_NAME This name should not be used in libc++36 37// libc++ does not use single-letter names as a matter of principle.38// But Windows' own <wchar.h>, <math.h>, and <exception> use many of these39// (at least C,E,F,I,M,N,P,S,X,Y,Z) as uglified function parameter names,40// so don't define these on Windows.41//42#ifndef _WIN3243#define _A SYSTEM_RESERVED_NAME44#define _B SYSTEM_RESERVED_NAME45#define _C SYSTEM_RESERVED_NAME46#define _D SYSTEM_RESERVED_NAME47#define _E SYSTEM_RESERVED_NAME48#define _F SYSTEM_RESERVED_NAME49#define _G SYSTEM_RESERVED_NAME50#define _H SYSTEM_RESERVED_NAME51#define _I SYSTEM_RESERVED_NAME52#define _J SYSTEM_RESERVED_NAME53#define _K SYSTEM_RESERVED_NAME54#define _L SYSTEM_RESERVED_NAME55#define _M SYSTEM_RESERVED_NAME56#define _N SYSTEM_RESERVED_NAME57#define _O SYSTEM_RESERVED_NAME58#define _P SYSTEM_RESERVED_NAME59#define _Q SYSTEM_RESERVED_NAME60#define _R SYSTEM_RESERVED_NAME61#define _S SYSTEM_RESERVED_NAME62#define _T SYSTEM_RESERVED_NAME63#define _U SYSTEM_RESERVED_NAME64#define _V SYSTEM_RESERVED_NAME65#define _W SYSTEM_RESERVED_NAME66#define _X SYSTEM_RESERVED_NAME67#define _Y SYSTEM_RESERVED_NAME68#define _Z SYSTEM_RESERVED_NAME69#endif70 71// FreeBSD's <sys/types.h> uses _M72//73#ifdef __FreeBSD__74# undef _M75#endif76 77// Test that libc++ doesn't use names that collide with FreeBSD system macros.78// newlib and picolibc also define these macros79#if !defined(__FreeBSD__) && !defined(_NEWLIB_VERSION)80# define __null_sentinel SYSTEM_RESERVED_NAME81# define __generic SYSTEM_RESERVED_NAME82#endif83 84// tchar.h defines these macros on Windows85#ifndef _WIN3286# define _UI SYSTEM_RESERVED_NAME87# define _PUC SYSTEM_RESERVED_NAME88# define _CPUC SYSTEM_RESERVED_NAME89# define _PC SYSTEM_RESERVED_NAME90# define _CRPC SYSTEM_RESERVED_NAME91# define _CPC SYSTEM_RESERVED_NAME92#endif93 94// yvals.h on MINGW defines this macro95#ifndef _WIN3296# define _C2 SYSTEM_RESERVED_NAME97#endif98 99// Test that libc++ doesn't use names that collide with Win32 API macros.100// Obviously we can only define these on non-Windows platforms.101#ifndef _WIN32102# define __allocator SYSTEM_RESERVED_NAME103# define __bound SYSTEM_RESERVED_NAME104# define __deallocate SYSTEM_RESERVED_NAME105# define __deref SYSTEM_RESERVED_NAME106# define __format_string SYSTEM_RESERVED_NAME107# define __full SYSTEM_RESERVED_NAME108# define __in SYSTEM_RESERVED_NAME109# define __inout SYSTEM_RESERVED_NAME110# define __nz SYSTEM_RESERVED_NAME111# define __out SYSTEM_RESERVED_NAME112# define __part SYSTEM_RESERVED_NAME113# define __post SYSTEM_RESERVED_NAME114# define __pre SYSTEM_RESERVED_NAME115#endif116 117// Newlib & picolibc use __input as a parameter name of a64l & l64a118#ifndef _NEWLIB_VERSION119# define __input SYSTEM_RESERVED_NAME120#endif121#define __output SYSTEM_RESERVED_NAME122 123#define __acquire SYSTEM_RESERVED_NAME124#define __release SYSTEM_RESERVED_NAME125 126// Android and FreeBSD use this for __attribute__((__unused__))127#if !defined(__FreeBSD__) && !defined(__ANDROID__)128#define __unused SYSTEM_RESERVED_NAME129#endif130 131// These names are not reserved, so the user can macro-define them.132// These are intended to find improperly _Uglified template parameters.133#define A SYSTEM_RESERVED_NAME134#define Arg SYSTEM_RESERVED_NAME135#define Args SYSTEM_RESERVED_NAME136#define As SYSTEM_RESERVED_NAME137#define B SYSTEM_RESERVED_NAME138#define Bs SYSTEM_RESERVED_NAME139#define C SYSTEM_RESERVED_NAME140#define Cp SYSTEM_RESERVED_NAME141#define Cs SYSTEM_RESERVED_NAME142// Windows setjmp.h contains a struct member named 'D' on ARM/AArch64.143#ifndef _WIN32144# define D SYSTEM_RESERVED_NAME145#endif146#define Dp SYSTEM_RESERVED_NAME147#define Ds SYSTEM_RESERVED_NAME148#define E SYSTEM_RESERVED_NAME149#define Ep SYSTEM_RESERVED_NAME150#define Es SYSTEM_RESERVED_NAME151#define N SYSTEM_RESERVED_NAME152#define Np SYSTEM_RESERVED_NAME153#define Ns SYSTEM_RESERVED_NAME154#define R SYSTEM_RESERVED_NAME155#define Rp SYSTEM_RESERVED_NAME156#define Rs SYSTEM_RESERVED_NAME157#define T SYSTEM_RESERVED_NAME158#define Tp SYSTEM_RESERVED_NAME159#define Ts SYSTEM_RESERVED_NAME160#define Type SYSTEM_RESERVED_NAME161#define Types SYSTEM_RESERVED_NAME162#define U SYSTEM_RESERVED_NAME163#define Up SYSTEM_RESERVED_NAME164#define Us SYSTEM_RESERVED_NAME165#define V SYSTEM_RESERVED_NAME166#define Vp SYSTEM_RESERVED_NAME167#define Vs SYSTEM_RESERVED_NAME168#define X SYSTEM_RESERVED_NAME169#define Xp SYSTEM_RESERVED_NAME170#define Xs SYSTEM_RESERVED_NAME171 172// The classic Windows min/max macros173#define min SYSTEM_RESERVED_NAME174#define max SYSTEM_RESERVED_NAME175 176// Test to make sure curses has no conflicting macros with the standard library177#define move SYSTEM_RESERVED_NAME178#define erase SYSTEM_RESERVED_NAME179#define refresh SYSTEM_RESERVED_NAME180 181// Dinkumware libc ctype.h uses these definitions182#define _XA SYSTEM_RESERVED_NAME183#define _XS SYSTEM_RESERVED_NAME184#define _BB SYSTEM_RESERVED_NAME185#define _CN SYSTEM_RESERVED_NAME186#define _DI SYSTEM_RESERVED_NAME187#define _LO SYSTEM_RESERVED_NAME188#define _PU SYSTEM_RESERVED_NAME189#define _SP SYSTEM_RESERVED_NAME190#define _UP SYSTEM_RESERVED_NAME191#define _XD SYSTEM_RESERVED_NAME192 193#include <{header}>194 195// Make sure we don't swallow the definition of the macros we push/pop196#define STRINGIFY_IMPL(x) #x197#define STRINGIFY(x) STRINGIFY_IMPL(x)198static_assert(__builtin_strcmp(STRINGIFY(min), STRINGIFY(SYSTEM_RESERVED_NAME)) == 0, "");199static_assert(__builtin_strcmp(STRINGIFY(max), STRINGIFY(SYSTEM_RESERVED_NAME)) == 0, "");200static_assert(__builtin_strcmp(STRINGIFY(move), STRINGIFY(SYSTEM_RESERVED_NAME)) == 0, "");201static_assert(__builtin_strcmp(STRINGIFY(erase), STRINGIFY(SYSTEM_RESERVED_NAME)) == 0, "");202static_assert(__builtin_strcmp(STRINGIFY(refresh), STRINGIFY(SYSTEM_RESERVED_NAME)) == 0, "");203"""204 )205