llvm-project/clang/test/Preprocessor/macro-reserved.c
John Brawn 0123deb3a6 [Lex] Warn when defining or undefining any builtin macro
Currently we warn when MI->isBuiltinMacro, but this is only true for
builtin macros that require processing when expanding. Checking
SourceMgr.isWrittenInBuiltinFile in addition to this will mean that
we catch all builtin macros, though we shouldn't warn on feature test
macros.

As part of doing this I've also moved the handling of undefining from
CheckMacroName to HandleUndefDirective, as it doesn't really make
sense to handle undefining in CheckMacroName but defining in
HandleDefineDirective. It would be nice to instead handle both in
CheckMacroName, but that isn't possible as the handling of defines
requires looking at what the name is being defined to.

Differential Revision: https://reviews.llvm.org/D144654
2023-05-25 11:55:44 +01:00

70 lines
2.0 KiB
C

// RUN: %clang_cc1 -fsyntax-only -pedantic -verify %s
#define for 0 // expected-warning {{keyword is hidden by macro definition}}
#define final 1
#define __HAVE_X 0
#define __cplusplus
#define _HAVE_X 0
#define X__Y
#define __STDC__ 1 // expected-warning {{redefining builtin macro}}
#undef for
#undef final
#undef __HAVE_X
#undef __cplusplus
#undef _HAVE_X
#undef X__Y
#undef __STDC_HOSTED__ // expected-warning {{undefining builtin macro}}
// allowlisted definitions
#define while while
#define const
#define static
#define extern
#define inline
#undef while
#undef const
#undef static
#undef extern
#undef inline
#define inline __inline
#undef inline
#define inline __inline__
#undef inline
#define inline inline__ // expected-warning {{keyword is hidden by macro definition}}
#undef inline
#define extern __inline // expected-warning {{keyword is hidden by macro definition}}
#undef extern
#define extern __extern // expected-warning {{keyword is hidden by macro definition}}
#undef extern
#define extern __extern__ // expected-warning {{keyword is hidden by macro definition}}
#undef extern
#define inline _inline // expected-warning {{keyword is hidden by macro definition}}
#undef inline
#define volatile // expected-warning {{keyword is hidden by macro definition}}
#undef volatile
#pragma clang diagnostic warning "-Wreserved-macro-identifier"
#define switch if // expected-warning {{keyword is hidden by macro definition}}
#define final 1
#define __clusplus // expected-warning {{macro name is a reserved identifier}}
#define __HAVE_X 0 // expected-warning {{macro name is a reserved identifier}}
#define _HAVE_X 0 // expected-warning {{macro name is a reserved identifier}}
#define X__Y
#undef switch
#undef final
#undef __cplusplus // expected-warning {{macro name is a reserved identifier}}
#undef _HAVE_X // expected-warning {{macro name is a reserved identifier}}
#undef X__Y
int x;
#define _GNU_SOURCE // no-warning
#define __STDC_FORMAT_MACROS // no-warning