1*07c0f04eSSerge Pavlov // RUN: %clang_cc1 -fsyntax-only -verify -pedantic %s
292c14bb2SNico Weber 
359da7b8aSSerge Pavlov #define for 0    // expected-warning {{keyword is hidden by macro definition}}
4*07c0f04eSSerge Pavlov #define final 1
559da7b8aSSerge Pavlov #define __HAVE_X 0
659da7b8aSSerge Pavlov #define _HAVE_X 0
759da7b8aSSerge Pavlov #define X__Y
859da7b8aSSerge Pavlov 
9*07c0f04eSSerge Pavlov #undef for
10*07c0f04eSSerge Pavlov #undef final
11*07c0f04eSSerge Pavlov #undef __HAVE_X
1259da7b8aSSerge Pavlov #undef _HAVE_X
1359da7b8aSSerge Pavlov #undef X__Y
1459da7b8aSSerge Pavlov 
15*07c0f04eSSerge Pavlov #undef __cplusplus
16*07c0f04eSSerge Pavlov #define __cplusplus
17*07c0f04eSSerge Pavlov 
18*07c0f04eSSerge Pavlov // whitelisted definitions
19*07c0f04eSSerge Pavlov #define while while
20*07c0f04eSSerge Pavlov #define const
21*07c0f04eSSerge Pavlov #define static
22*07c0f04eSSerge Pavlov #define extern
23*07c0f04eSSerge Pavlov #define inline
24*07c0f04eSSerge Pavlov 
25*07c0f04eSSerge Pavlov #undef while
26*07c0f04eSSerge Pavlov #undef const
27*07c0f04eSSerge Pavlov #undef static
28*07c0f04eSSerge Pavlov #undef extern
29*07c0f04eSSerge Pavlov #undef inline
30*07c0f04eSSerge Pavlov 
31*07c0f04eSSerge Pavlov #define inline __inline
32*07c0f04eSSerge Pavlov #undef  inline
33*07c0f04eSSerge Pavlov #define inline __inline__
34*07c0f04eSSerge Pavlov #undef  inline
35*07c0f04eSSerge Pavlov 
36*07c0f04eSSerge Pavlov #define inline inline__  // expected-warning {{keyword is hidden by macro definition}}
37*07c0f04eSSerge Pavlov #undef  inline
38*07c0f04eSSerge Pavlov #define extern __inline  // expected-warning {{keyword is hidden by macro definition}}
39*07c0f04eSSerge Pavlov #undef  extern
40*07c0f04eSSerge Pavlov #define extern __extern	 // expected-warning {{keyword is hidden by macro definition}}
41*07c0f04eSSerge Pavlov #undef  extern
42*07c0f04eSSerge Pavlov #define extern __extern__ // expected-warning {{keyword is hidden by macro definition}}
43*07c0f04eSSerge Pavlov #undef  extern
44*07c0f04eSSerge Pavlov 
45*07c0f04eSSerge Pavlov #define inline _inline   // expected-warning {{keyword is hidden by macro definition}}
46*07c0f04eSSerge Pavlov #undef  inline
47*07c0f04eSSerge Pavlov #define volatile   // expected-warning {{keyword is hidden by macro definition}}
48*07c0f04eSSerge Pavlov #undef  volatile
49*07c0f04eSSerge Pavlov 
50*07c0f04eSSerge Pavlov 
51*07c0f04eSSerge Pavlov #pragma clang diagnostic warning "-Wreserved-id-macro"
52*07c0f04eSSerge Pavlov 
5359da7b8aSSerge Pavlov #define switch if  // expected-warning {{keyword is hidden by macro definition}}
54*07c0f04eSSerge Pavlov #define final 1
55*07c0f04eSSerge Pavlov #define __HAVE_X 0 // expected-warning {{macro name is a reserved identifier}}
56*07c0f04eSSerge Pavlov #define _HAVE_X 0  // expected-warning {{macro name is a reserved identifier}}
57*07c0f04eSSerge Pavlov #define X__Y       // expected-warning {{macro name is a reserved identifier}}
5859da7b8aSSerge Pavlov 
59*07c0f04eSSerge Pavlov #undef __cplusplus // expected-warning {{macro name is a reserved identifier}}
60*07c0f04eSSerge Pavlov #undef _HAVE_X     // expected-warning {{macro name is a reserved identifier}}
61*07c0f04eSSerge Pavlov #undef X__Y        // expected-warning {{macro name is a reserved identifier}}
6259da7b8aSSerge Pavlov 
6359da7b8aSSerge Pavlov int x;
64