1 | // RUN: %clang_cc1 -std=c++03 -fsyntax-only %s |
2 | // RUN: %clang_cc1 -std=c++11 -DCXX11 -fsyntax-only %s |
3 | // RUN: %clang_cc1 -std=c++14 -fconcepts-ts -DCXX11 -DCONCEPTS -fsyntax-only %s |
4 | // RUN: %clang_cc1 -std=c++2a -DCXX11 -DCXX2A -fsyntax-only %s |
5 | // RUN: %clang_cc1 -std=c++03 -fdeclspec -DDECLSPEC -fsyntax-only %s |
6 | // RUN: %clang_cc1 -std=c++03 -fms-extensions -DDECLSPEC -fsyntax-only %s |
7 | // RUN: %clang_cc1 -std=c++03 -fborland-extensions -DDECLSPEC -fsyntax-only %s |
8 | // RUN: %clang_cc1 -std=c++03 -fms-extensions -fno-declspec -fsyntax-only %s |
9 | // RUN: %clang_cc1 -std=c++03 -fborland-extensions -fno-declspec -fsyntax-only %s |
10 | // RUN: %clang_cc1 -std=c++03 -fno-declspec -fdeclspec -DDECLSPEC -fsyntax-only %s |
11 | // RUN: %clang_cc1 -std=c++03 -fdeclspec -fno-declspec -fsyntax-only %s |
12 | // RUN: %clang_cc1 -std=c++03 -fms-extensions -fno-declspec -fdeclspec -DDECLSPEC -fsyntax-only %s |
13 | // RUN: %clang_cc1 -std=c++03 -fms-extensions -fdeclspec -fno-declspec -fsyntax-only %s |
14 | // RUN: %clang -std=c++03 -target i686-windows-msvc -DMS -DDECLSPEC -fsyntax-only %s |
15 | // RUN: %clang -std=c++03 -target x86_64-scei-ps4 -DDECLSPEC -fsyntax-only %s |
16 | // RUN: %clang -std=c++03 -target i686-windows-msvc -DMS -fno-declspec -fsyntax-only %s |
17 | // RUN: %clang -std=c++03 -target x86_64-scei-ps4 -fno-declspec -fsyntax-only %s |
18 | |
19 | #define IS_KEYWORD(NAME) _Static_assert(!__is_identifier(NAME), #NAME) |
20 | #define NOT_KEYWORD(NAME) _Static_assert(__is_identifier(NAME), #NAME) |
21 | #define IS_TYPE(NAME) void is_##NAME##_type() { int f(NAME); } |
22 | |
23 | #if defined(CONCEPTS) || defined(CXX2A) |
24 | #define CONCEPTS_KEYWORD(NAME) IS_KEYWORD(NAME) |
25 | #else |
26 | #define CONCEPTS_KEYWORD(NAME) NOT_KEYWORD(NAME) |
27 | #endif |
28 | |
29 | #ifdef DECLSPEC |
30 | #define DECLSPEC_KEYWORD(NAME) IS_KEYWORD(NAME) |
31 | #else |
32 | #define DECLSPEC_KEYWORD(NAME) NOT_KEYWORD(NAME) |
33 | #endif |
34 | |
35 | #ifdef CXX11 |
36 | #define CXX11_KEYWORD(NAME) IS_KEYWORD(NAME) |
37 | #define CXX11_TYPE(NAME) IS_TYPE(NAME) |
38 | #else |
39 | #define CXX11_KEYWORD(NAME) NOT_KEYWORD(NAME) |
40 | #define CXX11_TYPE(NAME) |
41 | #endif |
42 | |
43 | // C++11 keywords |
44 | CXX11_KEYWORD(nullptr); |
45 | CXX11_KEYWORD(decltype); |
46 | CXX11_KEYWORD(alignof); |
47 | CXX11_KEYWORD(alignas); |
48 | CXX11_KEYWORD(char16_t); |
49 | CXX11_TYPE(char16_t); |
50 | CXX11_KEYWORD(char32_t); |
51 | CXX11_TYPE(char32_t); |
52 | CXX11_KEYWORD(constexpr); |
53 | CXX11_KEYWORD(noexcept); |
54 | #ifndef MS |
55 | CXX11_KEYWORD(static_assert); |
56 | #else |
57 | // MS compiler recognizes static_assert in all modes. So should we. |
58 | IS_KEYWORD(static_assert); |
59 | #endif |
60 | CXX11_KEYWORD(thread_local); |
61 | |
62 | // Concepts TS keywords |
63 | CONCEPTS_KEYWORD(concept); |
64 | CONCEPTS_KEYWORD(requires); |
65 | |
66 | // __declspec extension |
67 | DECLSPEC_KEYWORD(__declspec); |
68 | |
69 | // Clang extension |
70 | IS_KEYWORD(__char16_t); |
71 | IS_TYPE(__char16_t); |
72 | IS_KEYWORD(__char32_t); |
73 | IS_TYPE(__char32_t); |
74 | |