11f5207b7SJohn Levon 
21f5207b7SJohn Levon #define IDENT(n) __IDENT(n## _ident, #n, 0)
31f5207b7SJohn Levon #define IDENT_RESERVED(n) __IDENT(n## _ident, #n, 1)
41f5207b7SJohn Levon 
51f5207b7SJohn Levon /* Basic C reserved words.. */
61f5207b7SJohn Levon IDENT_RESERVED(sizeof);
71f5207b7SJohn Levon IDENT_RESERVED(if);
81f5207b7SJohn Levon IDENT_RESERVED(else);
91f5207b7SJohn Levon IDENT_RESERVED(return);
101f5207b7SJohn Levon IDENT_RESERVED(switch);
111f5207b7SJohn Levon IDENT_RESERVED(case);
121f5207b7SJohn Levon IDENT_RESERVED(default);
131f5207b7SJohn Levon IDENT_RESERVED(break);
141f5207b7SJohn Levon IDENT_RESERVED(continue);
151f5207b7SJohn Levon IDENT_RESERVED(for);
161f5207b7SJohn Levon IDENT_RESERVED(while);
171f5207b7SJohn Levon IDENT_RESERVED(do);
181f5207b7SJohn Levon IDENT_RESERVED(goto);
191f5207b7SJohn Levon 
201f5207b7SJohn Levon /* C typenames. They get marked as reserved when initialized */
211f5207b7SJohn Levon IDENT(struct);
221f5207b7SJohn Levon IDENT(union);
231f5207b7SJohn Levon IDENT(enum);
241f5207b7SJohn Levon IDENT(__attribute); IDENT(__attribute__);
251f5207b7SJohn Levon IDENT(volatile); IDENT(__volatile); IDENT(__volatile__);
261f5207b7SJohn Levon IDENT(double);
271f5207b7SJohn Levon 
281f5207b7SJohn Levon /* C storage classes. They get marked as reserved when initialized */
291f5207b7SJohn Levon IDENT(static);
301f5207b7SJohn Levon 
311f5207b7SJohn Levon /* C99 keywords */
321f5207b7SJohn Levon IDENT(restrict); IDENT(__restrict); IDENT(__restrict__);
331f5207b7SJohn Levon IDENT(_Bool);
34*eb44bcc7SJohn Levon IDENT_RESERVED(_Complex);
351f5207b7SJohn Levon IDENT_RESERVED(_Imaginary);
361f5207b7SJohn Levon 
371f5207b7SJohn Levon /* C11 keywords */
381f5207b7SJohn Levon IDENT(_Alignas);
391f5207b7SJohn Levon IDENT_RESERVED(_Alignof);
40c85f09ccSJohn Levon IDENT(_Atomic);
411f5207b7SJohn Levon IDENT_RESERVED(_Generic);
421f5207b7SJohn Levon IDENT(_Noreturn);
431f5207b7SJohn Levon IDENT_RESERVED(_Static_assert);
441f5207b7SJohn Levon IDENT(_Thread_local);
451f5207b7SJohn Levon 
461f5207b7SJohn Levon /* Special case for L'\t' */
471f5207b7SJohn Levon IDENT(L);
481f5207b7SJohn Levon 
491f5207b7SJohn Levon /* Extended gcc identifiers */
501f5207b7SJohn Levon IDENT(asm); IDENT_RESERVED(__asm); IDENT_RESERVED(__asm__);
511f5207b7SJohn Levon IDENT(alignof); IDENT_RESERVED(__alignof); IDENT_RESERVED(__alignof__);
521f5207b7SJohn Levon IDENT_RESERVED(__sizeof_ptr__);
531f5207b7SJohn Levon IDENT_RESERVED(__builtin_types_compatible_p);
541f5207b7SJohn Levon IDENT_RESERVED(__builtin_offsetof);
551f5207b7SJohn Levon IDENT_RESERVED(__label__);
561f5207b7SJohn Levon 
571f5207b7SJohn Levon /* Preprocessor idents.  Direct use of __IDENT avoids mentioning the keyword
581f5207b7SJohn Levon  * itself by name, preventing these tokens from expanding when compiling
591f5207b7SJohn Levon  * sparse. */
601f5207b7SJohn Levon IDENT(defined);
611f5207b7SJohn Levon IDENT(once);
62c85f09ccSJohn Levon IDENT(__has_attribute);
63c85f09ccSJohn Levon IDENT(__has_builtin);
641f5207b7SJohn Levon __IDENT(pragma_ident, "__pragma__", 0);
651f5207b7SJohn Levon __IDENT(_Pragma_ident, "_Pragma", 0);
661f5207b7SJohn Levon __IDENT(__VA_ARGS___ident, "__VA_ARGS__", 0);
671f5207b7SJohn Levon __IDENT(__func___ident, "__func__", 0);
681f5207b7SJohn Levon __IDENT(__FUNCTION___ident, "__FUNCTION__", 0);
691f5207b7SJohn Levon __IDENT(__PRETTY_FUNCTION___ident, "__PRETTY_FUNCTION__", 0);
701f5207b7SJohn Levon 
711f5207b7SJohn Levon /* Sparse commands */
721f5207b7SJohn Levon IDENT_RESERVED(__context__);
731f5207b7SJohn Levon IDENT_RESERVED(__range__);
741f5207b7SJohn Levon 
751f5207b7SJohn Levon /* Magic function names we recognize */
761f5207b7SJohn Levon IDENT(memset); IDENT(memcpy);
771f5207b7SJohn Levon IDENT(copy_to_user); IDENT(copy_from_user);
781f5207b7SJohn Levon IDENT(main);
791f5207b7SJohn Levon 
801f5207b7SJohn Levon #undef __IDENT
811f5207b7SJohn Levon #undef IDENT
821f5207b7SJohn Levon #undef IDENT_RESERVED
83