xref: /llvm-project/clang/test/Lexer/keywords_test.c (revision 9c4ade0623af842cda16e5c71b27fb794a3ff3db)
1 // RUN: %clang_cc1 -std=c99 -E %s -o - | FileCheck --check-prefix=CHECK-NONE %s
2 
3 // RUN: %clang_cc1 -std=gnu89 -E %s -o - \
4 // RUN:     | FileCheck --check-prefix=CHECK-GNU-KEYWORDS %s
5 // RUN: %clang_cc1 -std=c99 -fgnu-keywords -E %s -o - \
6 // RUN:     | FileCheck --check-prefix=CHECK-GNU-KEYWORDS %s
7 // RUN: %clang_cc1 -std=gnu89 -fno-gnu-keywords -E %s -o - \
8 // RUN:     | FileCheck --check-prefix=CHECK-NONE %s
9 
10 // RUN: %clang_cc1 -std=c99 -fms-extensions -fms-compatibility -E %s -o - \
11 // RUN:     | FileCheck --check-prefix=CHECK-MS-KEYWORDS %s
12 // RUN: %clang_cc1 -std=c99 -fdeclspec -E %s -o - \
13 // RUN:     | FileCheck --check-prefix=CHECK-DECLSPEC-KEYWORD %s
14 // RUN: %clang_cc1 -std=c99 -fms-extensions -fno-declspec -E %s -o - \
15 // RUN:     | FileCheck --check-prefix=CHECK-MS-KEYWORDS-WITHOUT-DECLSPEC %s
16 
17 // RUN: %clang_cc1 -std=c99 -DC99 -fsyntax-only %s
18 // RUN: %clang_cc1 -std=c2x -DC99 -DC2x -fsyntax-only %s
19 
20 // RUN: %clang_cc1 -fsyntax-only -std=c89 -DFutureKeyword -Wc2x-compat -Wc99-compat -verify=c89 %s
21 
22 #define IS_KEYWORD(NAME) _Static_assert(!__is_identifier(NAME), #NAME)
23 #define NOT_KEYWORD(NAME) _Static_assert(__is_identifier(NAME), #NAME)
24 
25 #if defined(C99)
26 #define C99_KEYWORD(NAME)  IS_KEYWORD(NAME)
27 #else
28 #define C99_KEYWORD(NAME)  NOT_KEYWORD(NAME)
29 #endif
30 
31 #if defined(C2x)
32 #define C2x_KEYWORD(NAME)  IS_KEYWORD(NAME)
33 #else
34 #define C2x_KEYWORD(NAME)  NOT_KEYWORD(NAME)
35 #endif
36 
37 // C99 Keywords.
38 C99_KEYWORD(restrict);
39 C99_KEYWORD(inline);
40 
41 // C2x Keywords.
42 C2x_KEYWORD(bool);
43 C2x_KEYWORD(true);
44 C2x_KEYWORD(false);
45 C2x_KEYWORD(static_assert);
46 C2x_KEYWORD(typeof);
47 C2x_KEYWORD(typeof_unqual);
48 C2x_KEYWORD(thread_local);
49 C2x_KEYWORD(alignas);
50 C2x_KEYWORD(alignof);
51 
f()52 void f() {
53 // CHECK-NONE: int asm
54 // CHECK-GNU-KEYWORDS: asm ("ret" : :)
55 #if __is_identifier(asm)
56   int asm;
57 #else
58   asm ("ret" : :);
59 #endif
60 }
61 
62 // CHECK-NONE: no_ms_wchar
63 // CHECK-MS-KEYWORDS: has_ms_wchar
64 // CHECK-MS-KEYWORDS-WITHOUT-DECLSPEC: has_ms_wchar
65 #if __is_identifier(__wchar_t)
66 void no_ms_wchar();
67 #else
68 void has_ms_wchar();
69 #endif
70 
71 // CHECK-NONE: no_declspec
72 // CHECK-MS-KEYWORDS: has_declspec
73 // CHECK-MS-KEYWORDS-WITHOUT-DECLSPEC: no_declspec
74 // CHECK-DECLSPEC-KEYWORD: has_declspec
75 #if __is_identifier(__declspec)
76 void no_declspec();
77 #else
78 void has_declspec();
79 #endif
80 
81 // CHECK-NONE: no_static_assert
82 // CHECK-GNU-KEYWORDS: no_static_assert
83 // CHECK-MS-KEYWORDS: has_static_assert
84 // CHECK-MS-KEYWORDS-WITHOUT-DECLSPEC: no_static_assert
85 #if __is_identifier(static_assert)
86 void no_static_assert();
87 #else
88 void has_static_assert();
89 #endif
90 
91 #ifdef FutureKeyword
92 
93   int restrict; // c89-warning {{'restrict' is a keyword in C99}}
94   int inline;  // c89-warning {{'inline' is a keyword in C99}}
95 
96   int bool; // c89-warning {{'bool' is a keyword in C23}}
97   char true; // c89-warning {{'true' is a keyword in C23}}
98   char false; // c89-warning {{'false' is a keyword in C23}}
99   float alignof; // c89-warning {{'alignof' is a keyword in C23}}
100   int typeof; // c89-warning {{'typeof' is a keyword in C23}}
101   int typeof_unqual; // c89-warning {{'typeof_unqual' is a keyword in C23}}
102   int alignas; // c89-warning {{'alignas' is a keyword in C23}}
103   int static_assert; // c89-warning {{'static_assert' is a keyword in C23}}
104 
105 #endif
106