1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | #ifndef LLVM_CLANG_FRONTEND_LANGSTANDARD_H |
10 | #define LLVM_CLANG_FRONTEND_LANGSTANDARD_H |
11 | |
12 | #include "clang/Basic/LLVM.h" |
13 | #include "clang/Frontend/FrontendOptions.h" |
14 | #include "llvm/ADT/StringRef.h" |
15 | |
16 | namespace clang { |
17 | |
18 | namespace frontend { |
19 | |
20 | enum LangFeatures { |
21 | = (1 << 0), |
22 | C99 = (1 << 1), |
23 | C11 = (1 << 2), |
24 | C17 = (1 << 3), |
25 | CPlusPlus = (1 << 4), |
26 | CPlusPlus11 = (1 << 5), |
27 | CPlusPlus14 = (1 << 6), |
28 | CPlusPlus17 = (1 << 7), |
29 | CPlusPlus2a = (1 << 8), |
30 | Digraphs = (1 << 9), |
31 | GNUMode = (1 << 10), |
32 | HexFloat = (1 << 11), |
33 | ImplicitInt = (1 << 12), |
34 | OpenCL = (1 << 13) |
35 | }; |
36 | |
37 | } |
38 | |
39 | |
40 | |
41 | struct LangStandard { |
42 | enum Kind { |
43 | #define LANGSTANDARD(id, name, lang, desc, features) \ |
44 | lang_##id, |
45 | #include "clang/Frontend/LangStandards.def" |
46 | lang_unspecified |
47 | }; |
48 | |
49 | const char *ShortName; |
50 | const char *Description; |
51 | unsigned Flags; |
52 | InputKind::Language Language; |
53 | |
54 | public: |
55 | |
56 | const char *getName() const { return ShortName; } |
57 | |
58 | |
59 | const char *getDescription() const { return Description; } |
60 | |
61 | |
62 | InputKind::Language getLanguage() const { return Language; } |
63 | |
64 | |
65 | bool hasLineComments() const { return Flags & frontend::LineComment; } |
66 | |
67 | |
68 | bool isC99() const { return Flags & frontend::C99; } |
69 | |
70 | |
71 | bool isC11() const { return Flags & frontend::C11; } |
72 | |
73 | |
74 | bool isC17() const { return Flags & frontend::C17; } |
75 | |
76 | |
77 | bool isCPlusPlus() const { return Flags & frontend::CPlusPlus; } |
78 | |
79 | |
80 | bool isCPlusPlus11() const { return Flags & frontend::CPlusPlus11; } |
81 | |
82 | |
83 | bool isCPlusPlus14() const { return Flags & frontend::CPlusPlus14; } |
84 | |
85 | |
86 | bool isCPlusPlus17() const { return Flags & frontend::CPlusPlus17; } |
87 | |
88 | |
89 | bool isCPlusPlus2a() const { return Flags & frontend::CPlusPlus2a; } |
90 | |
91 | |
92 | |
93 | bool hasDigraphs() const { return Flags & frontend::Digraphs; } |
94 | |
95 | |
96 | bool isGNUMode() const { return Flags & frontend::GNUMode; } |
97 | |
98 | |
99 | bool hasHexFloats() const { return Flags & frontend::HexFloat; } |
100 | |
101 | |
102 | bool hasImplicitInt() const { return Flags & frontend::ImplicitInt; } |
103 | |
104 | |
105 | bool isOpenCL() const { return Flags & frontend::OpenCL; } |
106 | |
107 | static const LangStandard &getLangStandardForKind(Kind K); |
108 | static const LangStandard *getLangStandardForName(StringRef Name); |
109 | }; |
110 | |
111 | } |
112 | |
113 | #endif |
114 | |