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 & CIR: we accept these so that we can run the optimizer on them, 30 /// and compile them to assembly or object code (or LLVM for CIR). 31 CIR, 32 LLVM_IR, 33 34 ///@{ Languages that the frontend can parse and compile. 35 C, 36 CXX, 37 ObjC, 38 ObjCXX, 39 OpenCL, 40 OpenCLCXX, 41 CUDA, 42 RenderScript, 43 HIP, 44 HLSL, 45 ///@} 46 }; 47 StringRef languageToString(Language L); 48 49 enum LangFeatures { 50 LineComment = (1 << 0), 51 C99 = (1 << 1), 52 C11 = (1 << 2), 53 C17 = (1 << 3), 54 C23 = (1 << 4), 55 CPlusPlus = (1 << 5), 56 CPlusPlus11 = (1 << 6), 57 CPlusPlus14 = (1 << 7), 58 CPlusPlus17 = (1 << 8), 59 CPlusPlus20 = (1 << 9), 60 CPlusPlus23 = (1 << 10), 61 CPlusPlus26 = (1 << 11), 62 Digraphs = (1 << 12), 63 GNUMode = (1 << 13), 64 HexFloat = (1 << 14), 65 OpenCL = (1 << 15), 66 HLSL = (1 << 16) 67 }; 68 69 /// LangStandard - Information about the properties of a particular language 70 /// standard. 71 struct LangStandard { 72 enum Kind { 73 #define LANGSTANDARD(id, name, lang, desc, features) \ 74 lang_##id, 75 #include "clang/Basic/LangStandards.def" 76 lang_unspecified 77 }; 78 79 const char *ShortName; 80 const char *Description; 81 unsigned Flags; 82 clang::Language Language; 83 84 public: 85 /// getName - Get the name of this standard. getNameLangStandard86 const char *getName() const { return ShortName; } 87 88 /// getDescription - Get the description of this standard. getDescriptionLangStandard89 const char *getDescription() const { return Description; } 90 91 /// Get the language that this standard describes. getLanguageLangStandard92 clang::Language getLanguage() const { return Language; } 93 94 /// Language supports '//' comments. hasLineCommentsLangStandard95 bool hasLineComments() const { return Flags & LineComment; } 96 97 /// isC99 - Language is a superset of C99. isC99LangStandard98 bool isC99() const { return Flags & C99; } 99 100 /// isC11 - Language is a superset of C11. isC11LangStandard101 bool isC11() const { return Flags & C11; } 102 103 /// isC17 - Language is a superset of C17. isC17LangStandard104 bool isC17() const { return Flags & C17; } 105 106 /// isC23 - Language is a superset of C23. isC23LangStandard107 bool isC23() const { return Flags & C23; } 108 109 /// isCPlusPlus - Language is a C++ variant. isCPlusPlusLangStandard110 bool isCPlusPlus() const { return Flags & CPlusPlus; } 111 112 /// isCPlusPlus11 - Language is a C++11 variant (or later). isCPlusPlus11LangStandard113 bool isCPlusPlus11() const { return Flags & CPlusPlus11; } 114 115 /// isCPlusPlus14 - Language is a C++14 variant (or later). isCPlusPlus14LangStandard116 bool isCPlusPlus14() const { return Flags & CPlusPlus14; } 117 118 /// isCPlusPlus17 - Language is a C++17 variant (or later). isCPlusPlus17LangStandard119 bool isCPlusPlus17() const { return Flags & CPlusPlus17; } 120 121 /// isCPlusPlus20 - Language is a C++20 variant (or later). isCPlusPlus20LangStandard122 bool isCPlusPlus20() const { return Flags & CPlusPlus20; } 123 124 /// isCPlusPlus23 - Language is a post-C++23 variant (or later). isCPlusPlus23LangStandard125 bool isCPlusPlus23() const { return Flags & CPlusPlus23; } 126 127 /// isCPlusPlus26 - Language is a post-C++26 variant (or later). isCPlusPlus26LangStandard128 bool isCPlusPlus26() const { return Flags & CPlusPlus26; } 129 130 /// hasDigraphs - Language supports digraphs. hasDigraphsLangStandard131 bool hasDigraphs() const { return Flags & Digraphs; } 132 133 /// isGNUMode - Language includes GNU extensions. isGNUModeLangStandard134 bool isGNUMode() const { return Flags & GNUMode; } 135 136 /// hasHexFloats - Language supports hexadecimal float constants. hasHexFloatsLangStandard137 bool hasHexFloats() const { return Flags & HexFloat; } 138 139 /// isOpenCL - Language is a OpenCL variant. isOpenCLLangStandard140 bool isOpenCL() const { return Flags & OpenCL; } 141 142 static Kind getLangKind(StringRef Name); 143 static Kind getHLSLLangKind(StringRef Name); 144 static const LangStandard &getLangStandardForKind(Kind K); 145 static const LangStandard *getLangStandardForName(StringRef Name); 146 }; 147 148 LangStandard::Kind getDefaultLanguageStandard(clang::Language Lang, 149 const llvm::Triple &T); 150 151 } // end namespace clang 152 153 #endif 154