1 //===--- LangStandard.h -----------------------------------------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #ifndef LLVM_CLANG_BASIC_LANGSTANDARD_H
10 #define LLVM_CLANG_BASIC_LANGSTANDARD_H
11 
12 #include "clang/Basic/LLVM.h"
13 #include "llvm/ADT/StringRef.h"
14 
15 namespace clang {
16 
17 /// The language for the input, used to select and validate the language
18 /// standard and possible actions.
19 enum class Language : uint8_t {
20   Unknown,
21 
22   /// Assembly: we accept this only so that we can preprocess it.
23   Asm,
24 
25   /// LLVM IR: we accept this so that we can run the optimizer on it,
26   /// and compile it to assembly or object code.
27   LLVM_IR,
28 
29   ///@{ Languages that the frontend can parse and compile.
30   C,
31   CXX,
32   ObjC,
33   ObjCXX,
34   OpenCL,
35   OpenCLCXX,
36   CUDA,
37   RenderScript,
38   HIP,
39   ///@}
40 };
41 
42 enum LangFeatures {
43   LineComment = (1 << 0),
44   C99 = (1 << 1),
45   C11 = (1 << 2),
46   C17 = (1 << 3),
47   C2x = (1 << 4),
48   CPlusPlus = (1 << 5),
49   CPlusPlus11 = (1 << 6),
50   CPlusPlus14 = (1 << 7),
51   CPlusPlus17 = (1 << 8),
52   CPlusPlus20 = (1 << 9),
53   CPlusPlus2b = (1 << 10),
54   Digraphs = (1 << 11),
55   GNUMode = (1 << 12),
56   HexFloat = (1 << 13),
57   ImplicitInt = (1 << 14),
58   OpenCL = (1 << 15)
59 };
60 
61 /// LangStandard - Information about the properties of a particular language
62 /// standard.
63 struct LangStandard {
64   enum Kind {
65 #define LANGSTANDARD(id, name, lang, desc, features) \
66     lang_##id,
67 #include "clang/Basic/LangStandards.def"
68     lang_unspecified
69   };
70 
71   const char *ShortName;
72   const char *Description;
73   unsigned Flags;
74   clang::Language Language;
75 
76 public:
77   /// getName - Get the name of this standard.
getNameLangStandard78   const char *getName() const { return ShortName; }
79 
80   /// getDescription - Get the description of this standard.
getDescriptionLangStandard81   const char *getDescription() const { return Description; }
82 
83   /// Get the language that this standard describes.
getLanguageLangStandard84   clang::Language getLanguage() const { return Language; }
85 
86   /// Language supports '//' comments.
hasLineCommentsLangStandard87   bool hasLineComments() const { return Flags & LineComment; }
88 
89   /// isC99 - Language is a superset of C99.
isC99LangStandard90   bool isC99() const { return Flags & C99; }
91 
92   /// isC11 - Language is a superset of C11.
isC11LangStandard93   bool isC11() const { return Flags & C11; }
94 
95   /// isC17 - Language is a superset of C17.
isC17LangStandard96   bool isC17() const { return Flags & C17; }
97 
98   /// isC2x - Language is a superset of C2x.
isC2xLangStandard99   bool isC2x() const { return Flags & C2x; }
100 
101   /// isCPlusPlus - Language is a C++ variant.
isCPlusPlusLangStandard102   bool isCPlusPlus() const { return Flags & CPlusPlus; }
103 
104   /// isCPlusPlus11 - Language is a C++11 variant (or later).
isCPlusPlus11LangStandard105   bool isCPlusPlus11() const { return Flags & CPlusPlus11; }
106 
107   /// isCPlusPlus14 - Language is a C++14 variant (or later).
isCPlusPlus14LangStandard108   bool isCPlusPlus14() const { return Flags & CPlusPlus14; }
109 
110   /// isCPlusPlus17 - Language is a C++17 variant (or later).
isCPlusPlus17LangStandard111   bool isCPlusPlus17() const { return Flags & CPlusPlus17; }
112 
113   /// isCPlusPlus20 - Language is a C++20 variant (or later).
isCPlusPlus20LangStandard114   bool isCPlusPlus20() const { return Flags & CPlusPlus20; }
115 
116   /// isCPlusPlus2b - Language is a post-C++20 variant (or later).
isCPlusPlus2bLangStandard117   bool isCPlusPlus2b() const { return Flags & CPlusPlus2b; }
118 
119   /// hasDigraphs - Language supports digraphs.
hasDigraphsLangStandard120   bool hasDigraphs() const { return Flags & Digraphs; }
121 
122   /// isGNUMode - Language includes GNU extensions.
isGNUModeLangStandard123   bool isGNUMode() const { return Flags & GNUMode; }
124 
125   /// hasHexFloats - Language supports hexadecimal float constants.
hasHexFloatsLangStandard126   bool hasHexFloats() const { return Flags & HexFloat; }
127 
128   /// hasImplicitInt - Language allows variables to be typed as int implicitly.
hasImplicitIntLangStandard129   bool hasImplicitInt() const { return Flags & ImplicitInt; }
130 
131   /// isOpenCL - Language is a OpenCL variant.
isOpenCLLangStandard132   bool isOpenCL() const { return Flags & OpenCL; }
133 
134   static Kind getLangKind(StringRef Name);
135   static const LangStandard &getLangStandardForKind(Kind K);
136   static const LangStandard *getLangStandardForName(StringRef Name);
137 };
138 
139 }  // end namespace clang
140 
141 #endif
142