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 llvm {
16 class Triple;
17 }
18 
19 namespace clang {
20 
21 /// The language for the input, used to select and validate the language
22 /// standard and possible actions.
23 enum class Language : uint8_t {
24   Unknown,
25 
26   /// Assembly: we accept this only so that we can preprocess it.
27   Asm,
28 
29   /// LLVM IR: we accept this so that we can run the optimizer on it,
30   /// and compile it to assembly or object code.
31   LLVM_IR,
32 
33   ///@{ Languages that the frontend can parse and compile.
34   C,
35   CXX,
36   ObjC,
37   ObjCXX,
38   OpenCL,
39   OpenCLCXX,
40   CUDA,
41   RenderScript,
42   HIP,
43   HLSL,
44   ///@}
45 };
46 StringRef languageToString(Language L);
47 
48 enum LangFeatures {
49   LineComment = (1 << 0),
50   C99 = (1 << 1),
51   C11 = (1 << 2),
52   C17 = (1 << 3),
53   C23 = (1 << 4),
54   CPlusPlus = (1 << 5),
55   CPlusPlus11 = (1 << 6),
56   CPlusPlus14 = (1 << 7),
57   CPlusPlus17 = (1 << 8),
58   CPlusPlus20 = (1 << 9),
59   CPlusPlus23 = (1 << 10),
60   CPlusPlus26 = (1 << 11),
61   Digraphs = (1 << 12),
62   GNUMode = (1 << 13),
63   HexFloat = (1 << 14),
64   OpenCL = (1 << 15),
65   HLSL = (1 << 16)
66 };
67 
68 /// LangStandard - Information about the properties of a particular language
69 /// standard.
70 struct LangStandard {
71   enum Kind {
72 #define LANGSTANDARD(id, name, lang, desc, features) \
73     lang_##id,
74 #include "clang/Basic/LangStandards.def"
75     lang_unspecified
76   };
77 
78   const char *ShortName;
79   const char *Description;
80   unsigned Flags;
81   clang::Language Language;
82 
83 public:
84   /// getName - Get the name of this standard.
getNameLangStandard85   const char *getName() const { return ShortName; }
86 
87   /// getDescription - Get the description of this standard.
getDescriptionLangStandard88   const char *getDescription() const { return Description; }
89 
90   /// Get the language that this standard describes.
getLanguageLangStandard91   clang::Language getLanguage() const { return Language; }
92 
93   /// Language supports '//' comments.
hasLineCommentsLangStandard94   bool hasLineComments() const { return Flags & LineComment; }
95 
96   /// isC99 - Language is a superset of C99.
isC99LangStandard97   bool isC99() const { return Flags & C99; }
98 
99   /// isC11 - Language is a superset of C11.
isC11LangStandard100   bool isC11() const { return Flags & C11; }
101 
102   /// isC17 - Language is a superset of C17.
isC17LangStandard103   bool isC17() const { return Flags & C17; }
104 
105   /// isC23 - Language is a superset of C23.
isC23LangStandard106   bool isC23() const { return Flags & C23; }
107 
108   /// isCPlusPlus - Language is a C++ variant.
isCPlusPlusLangStandard109   bool isCPlusPlus() const { return Flags & CPlusPlus; }
110 
111   /// isCPlusPlus11 - Language is a C++11 variant (or later).
isCPlusPlus11LangStandard112   bool isCPlusPlus11() const { return Flags & CPlusPlus11; }
113 
114   /// isCPlusPlus14 - Language is a C++14 variant (or later).
isCPlusPlus14LangStandard115   bool isCPlusPlus14() const { return Flags & CPlusPlus14; }
116 
117   /// isCPlusPlus17 - Language is a C++17 variant (or later).
isCPlusPlus17LangStandard118   bool isCPlusPlus17() const { return Flags & CPlusPlus17; }
119 
120   /// isCPlusPlus20 - Language is a C++20 variant (or later).
isCPlusPlus20LangStandard121   bool isCPlusPlus20() const { return Flags & CPlusPlus20; }
122 
123   /// isCPlusPlus23 - Language is a post-C++23 variant (or later).
isCPlusPlus23LangStandard124   bool isCPlusPlus23() const { return Flags & CPlusPlus23; }
125 
126   /// isCPlusPlus26 - Language is a post-C++26 variant (or later).
isCPlusPlus26LangStandard127   bool isCPlusPlus26() const { return Flags & CPlusPlus26; }
128 
129   /// hasDigraphs - Language supports digraphs.
hasDigraphsLangStandard130   bool hasDigraphs() const { return Flags & Digraphs; }
131 
132   /// isGNUMode - Language includes GNU extensions.
isGNUModeLangStandard133   bool isGNUMode() const { return Flags & GNUMode; }
134 
135   /// hasHexFloats - Language supports hexadecimal float constants.
hasHexFloatsLangStandard136   bool hasHexFloats() const { return Flags & HexFloat; }
137 
138   /// isOpenCL - Language is a OpenCL variant.
isOpenCLLangStandard139   bool isOpenCL() const { return Flags & OpenCL; }
140 
141   static Kind getLangKind(StringRef Name);
142   static const LangStandard &getLangStandardForKind(Kind K);
143   static const LangStandard *getLangStandardForName(StringRef Name);
144 };
145 
146 LangStandard::Kind getDefaultLanguageStandard(clang::Language Lang,
147                                               const llvm::Triple &T);
148 
149 }  // end namespace clang
150 
151 #endif
152