- //===--- LangStandard.h -----------------------------------------*- C++ -*-===// 
- // 
- // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 
- // See https://llvm.org/LICENSE.txt for license information. 
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 
- // 
- //===----------------------------------------------------------------------===// 
-   
- #ifndef LLVM_CLANG_BASIC_LANGSTANDARD_H 
- #define LLVM_CLANG_BASIC_LANGSTANDARD_H 
-   
- #include "clang/Basic/LLVM.h" 
- #include "llvm/ADT/StringRef.h" 
-   
- namespace llvm { 
- class Triple; 
- } 
-   
- namespace clang { 
-   
- /// The language for the input, used to select and validate the language 
- /// standard and possible actions. 
- enum class Language : uint8_t { 
-   Unknown, 
-   
-   /// Assembly: we accept this only so that we can preprocess it. 
-   Asm, 
-   
-   /// LLVM IR: we accept this so that we can run the optimizer on it, 
-   /// and compile it to assembly or object code. 
-   LLVM_IR, 
-   
-   ///@{ Languages that the frontend can parse and compile. 
-   C, 
-   CXX, 
-   ObjC, 
-   ObjCXX, 
-   OpenCL, 
-   OpenCLCXX, 
-   CUDA, 
-   RenderScript, 
-   HIP, 
-   HLSL, 
-   ///@} 
- }; 
-   
- enum LangFeatures { 
-   LineComment = (1 << 0), 
-   C99 = (1 << 1), 
-   C11 = (1 << 2), 
-   C17 = (1 << 3), 
-   C2x = (1 << 4), 
-   CPlusPlus = (1 << 5), 
-   CPlusPlus11 = (1 << 6), 
-   CPlusPlus14 = (1 << 7), 
-   CPlusPlus17 = (1 << 8), 
-   CPlusPlus20 = (1 << 9), 
-   CPlusPlus2b = (1 << 10), 
-   Digraphs = (1 << 11), 
-   GNUMode = (1 << 12), 
-   HexFloat = (1 << 13), 
-   OpenCL = (1 << 14), 
-   HLSL = (1 << 15) 
- }; 
-   
- /// LangStandard - Information about the properties of a particular language 
- /// standard. 
- struct LangStandard { 
-   enum Kind { 
- #define LANGSTANDARD(id, name, lang, desc, features) \ 
-     lang_##id, 
- #include "clang/Basic/LangStandards.def" 
-     lang_unspecified 
-   }; 
-   
-   const char *ShortName; 
-   const char *Description; 
-   unsigned Flags; 
-   clang::Language Language; 
-   
- public: 
-   /// getName - Get the name of this standard. 
-   const char *getName() const { return ShortName; } 
-   
-   /// getDescription - Get the description of this standard. 
-   const char *getDescription() const { return Description; } 
-   
-   /// Get the language that this standard describes. 
-   clang::Language getLanguage() const { return Language; } 
-   
-   /// Language supports '//' comments. 
-   bool hasLineComments() const { return Flags & LineComment; } 
-   
-   /// isC99 - Language is a superset of C99. 
-   bool isC99() const { return Flags & C99; } 
-   
-   /// isC11 - Language is a superset of C11. 
-   bool isC11() const { return Flags & C11; } 
-   
-   /// isC17 - Language is a superset of C17. 
-   bool isC17() const { return Flags & C17; } 
-   
-   /// isC2x - Language is a superset of C2x. 
-   bool isC2x() const { return Flags & C2x; } 
-   
-   /// isCPlusPlus - Language is a C++ variant. 
-   bool isCPlusPlus() const { return Flags & CPlusPlus; } 
-   
-   /// isCPlusPlus11 - Language is a C++11 variant (or later). 
-   bool isCPlusPlus11() const { return Flags & CPlusPlus11; } 
-   
-   /// isCPlusPlus14 - Language is a C++14 variant (or later). 
-   bool isCPlusPlus14() const { return Flags & CPlusPlus14; } 
-   
-   /// isCPlusPlus17 - Language is a C++17 variant (or later). 
-   bool isCPlusPlus17() const { return Flags & CPlusPlus17; } 
-   
-   /// isCPlusPlus20 - Language is a C++20 variant (or later). 
-   bool isCPlusPlus20() const { return Flags & CPlusPlus20; } 
-   
-   /// isCPlusPlus2b - Language is a post-C++20 variant (or later). 
-   bool isCPlusPlus2b() const { return Flags & CPlusPlus2b; } 
-   
-   /// hasDigraphs - Language supports digraphs. 
-   bool hasDigraphs() const { return Flags & Digraphs; } 
-   
-   /// isGNUMode - Language includes GNU extensions. 
-   bool isGNUMode() const { return Flags & GNUMode; } 
-   
-   /// hasHexFloats - Language supports hexadecimal float constants. 
-   bool hasHexFloats() const { return Flags & HexFloat; } 
-   
-   /// isOpenCL - Language is a OpenCL variant. 
-   bool isOpenCL() const { return Flags & OpenCL; } 
-   
-   static Kind getLangKind(StringRef Name); 
-   static const LangStandard &getLangStandardForKind(Kind K); 
-   static const LangStandard *getLangStandardForName(StringRef Name); 
- }; 
-   
- LangStandard::Kind getDefaultLanguageStandard(clang::Language Lang, 
-                                               const llvm::Triple &T); 
-   
- }  // end namespace clang 
-   
- #endif 
-