17704ba7fSYunzhong Gao // RUN: %clang_cc1 -fsyntax-only -verify -pedantic -std=c++98 %s
292c14bb2SNico Weber 
359da7b8aSSerge Pavlov #define for 0    // expected-warning {{keyword is hidden by macro definition}}
407c0f04eSSerge Pavlov #define final 1
559da7b8aSSerge Pavlov #define __HAVE_X 0
659da7b8aSSerge Pavlov #define _HAVE_X 0
759da7b8aSSerge Pavlov #define X__Y
859da7b8aSSerge Pavlov 
907c0f04eSSerge Pavlov #undef for
1007c0f04eSSerge Pavlov #undef final
1107c0f04eSSerge Pavlov #undef __HAVE_X
1259da7b8aSSerge Pavlov #undef _HAVE_X
1359da7b8aSSerge Pavlov #undef X__Y
1459da7b8aSSerge Pavlov 
1507c0f04eSSerge Pavlov #undef __cplusplus
1607c0f04eSSerge Pavlov #define __cplusplus
1707c0f04eSSerge Pavlov 
18*c379911aSZarko Todorovski // allowlisted definitions
1907c0f04eSSerge Pavlov #define while while
2007c0f04eSSerge Pavlov #define const
2107c0f04eSSerge Pavlov #define static
2207c0f04eSSerge Pavlov #define extern
2307c0f04eSSerge Pavlov #define inline
2407c0f04eSSerge Pavlov 
2507c0f04eSSerge Pavlov #undef while
2607c0f04eSSerge Pavlov #undef const
2707c0f04eSSerge Pavlov #undef static
2807c0f04eSSerge Pavlov #undef extern
2907c0f04eSSerge Pavlov #undef inline
3007c0f04eSSerge Pavlov 
3107c0f04eSSerge Pavlov #define inline __inline
3207c0f04eSSerge Pavlov #undef  inline
3307c0f04eSSerge Pavlov #define inline __inline__
3407c0f04eSSerge Pavlov #undef  inline
3507c0f04eSSerge Pavlov 
3607c0f04eSSerge Pavlov #define inline inline__  // expected-warning {{keyword is hidden by macro definition}}
3707c0f04eSSerge Pavlov #undef  inline
3807c0f04eSSerge Pavlov #define extern __inline  // expected-warning {{keyword is hidden by macro definition}}
3907c0f04eSSerge Pavlov #undef  extern
4007c0f04eSSerge Pavlov #define extern __extern	 // expected-warning {{keyword is hidden by macro definition}}
4107c0f04eSSerge Pavlov #undef  extern
4207c0f04eSSerge Pavlov #define extern __extern__ // expected-warning {{keyword is hidden by macro definition}}
4307c0f04eSSerge Pavlov #undef  extern
4407c0f04eSSerge Pavlov 
4507c0f04eSSerge Pavlov #define inline _inline   // expected-warning {{keyword is hidden by macro definition}}
4607c0f04eSSerge Pavlov #undef  inline
4707c0f04eSSerge Pavlov #define volatile   // expected-warning {{keyword is hidden by macro definition}}
4807c0f04eSSerge Pavlov #undef  volatile
4907c0f04eSSerge Pavlov 
50b83b2327Sserge-sans-paille #pragma clang diagnostic warning "-Wreserved-macro-identifier"
5107c0f04eSSerge Pavlov 
5259da7b8aSSerge Pavlov #define switch if  // expected-warning {{keyword is hidden by macro definition}}
5307c0f04eSSerge Pavlov #define final 1
5407c0f04eSSerge Pavlov #define __HAVE_X 0 // expected-warning {{macro name is a reserved identifier}}
5507c0f04eSSerge Pavlov #define _HAVE_X 0  // expected-warning {{macro name is a reserved identifier}}
5607c0f04eSSerge Pavlov #define X__Y       // expected-warning {{macro name is a reserved identifier}}
5759da7b8aSSerge Pavlov 
5807c0f04eSSerge Pavlov #undef __cplusplus // expected-warning {{macro name is a reserved identifier}}
5907c0f04eSSerge Pavlov #undef _HAVE_X     // expected-warning {{macro name is a reserved identifier}}
6007c0f04eSSerge Pavlov #undef X__Y        // expected-warning {{macro name is a reserved identifier}}
6159da7b8aSSerge Pavlov 
6259da7b8aSSerge Pavlov int x;
63