File indexing completed on 2026-05-10 08:37:10
0001
0002
0003
0004
0005
0006
0007
0008
0009 #ifndef LLVM_CLANG_TESTING_TESTCLANGCONFIG_H
0010 #define LLVM_CLANG_TESTING_TESTCLANGCONFIG_H
0011
0012 #include "clang/Testing/CommandLineArgs.h"
0013 #include "llvm/Support/raw_ostream.h"
0014 #include <string>
0015 #include <vector>
0016
0017 namespace clang {
0018
0019
0020
0021
0022
0023
0024 struct TestClangConfig {
0025 TestLanguage Language;
0026
0027
0028 std::string Target;
0029
0030 bool isC() const {
0031 return false
0032 #define TESTLANGUAGE_C(lang, version, std_flag, version_index) \
0033 || Language == Lang_##lang##version
0034 #include "clang/Testing/TestLanguage.def"
0035 ;
0036 }
0037
0038 bool isC(int Version) const {
0039 return false
0040 #define TESTLANGUAGE_C(lang, version, std_flag, version_index) \
0041 || (Version == version && Language == Lang_##lang##version)
0042 #include "clang/Testing/TestLanguage.def"
0043 ;
0044 }
0045
0046 bool isCOrLater(int MinimumStdVersion) const {
0047 const auto MinimumStdVersionIndex = 0
0048 #define TESTLANGUAGE_C(lang, version, std_flag, version_index) \
0049 +(MinimumStdVersion == version ? version_index : 0)
0050 #include "clang/Testing/TestLanguage.def"
0051 ;
0052 switch (Language) {
0053 #define TESTLANGUAGE_C(lang, version, std_flag, version_index) \
0054 case Lang_##lang##version: \
0055 return MinimumStdVersionIndex <= version_index;
0056 #include "clang/Testing/TestLanguage.def"
0057 default:
0058 return false;
0059 }
0060 }
0061
0062 bool isC99OrLater() const { return isCOrLater(99); }
0063
0064 bool isCOrEarlier(int MaximumStdVersion) const {
0065 return isC() && (isC(MaximumStdVersion) || !isCOrLater(MaximumStdVersion));
0066 }
0067
0068 bool isCXX() const {
0069 return false
0070 #define TESTLANGUAGE_CXX(lang, version, std_flag, version_index) \
0071 || Language == Lang_##lang##version
0072 #include "clang/Testing/TestLanguage.def"
0073 ;
0074 }
0075
0076 bool isCXX(int Version) const {
0077 return false
0078 #define TESTLANGUAGE_CXX(lang, version, std_flag, version_index) \
0079 || (Version == version && Language == Lang_##lang##version)
0080 #include "clang/Testing/TestLanguage.def"
0081 ;
0082 }
0083
0084 bool isCXXOrLater(int MinimumStdVersion) const {
0085 const auto MinimumStdVersionIndex = 0
0086 #define TESTLANGUAGE_CXX(lang, version, std_flag, version_index) \
0087 +(MinimumStdVersion == version ? version_index : 0)
0088 #include "clang/Testing/TestLanguage.def"
0089 ;
0090 switch (Language) {
0091 #define TESTLANGUAGE_CXX(lang, version, std_flag, version_index) \
0092 case Lang_##lang##version: \
0093 return MinimumStdVersionIndex <= version_index;
0094 #include "clang/Testing/TestLanguage.def"
0095 default:
0096 return false;
0097 }
0098 }
0099
0100 bool isCXX11OrLater() const { return isCXXOrLater(11); }
0101
0102 bool isCXX14OrLater() const { return isCXXOrLater(14); }
0103
0104 bool isCXX17OrLater() const { return isCXXOrLater(17); }
0105
0106 bool isCXX20OrLater() const { return isCXXOrLater(20); }
0107
0108 bool isCXX23OrLater() const { return isCXXOrLater(23); }
0109
0110 bool isCXXOrEarlier(int MaximumStdVersion) const {
0111 return isCXX() &&
0112 (isCXX(MaximumStdVersion) || !isCXXOrLater(MaximumStdVersion));
0113 }
0114
0115 bool supportsCXXDynamicExceptionSpecification() const {
0116 return Language == Lang_CXX03 || Language == Lang_CXX11 ||
0117 Language == Lang_CXX14;
0118 }
0119
0120 bool hasDelayedTemplateParsing() const {
0121 return Target == "x86_64-pc-win32-msvc";
0122 }
0123
0124 std::vector<std::string> getCommandLineArgs() const {
0125 std::vector<std::string> Result = getCommandLineArgsForTesting(Language);
0126 Result.push_back("-target");
0127 Result.push_back(Target);
0128 return Result;
0129 }
0130
0131 std::string toShortString() const {
0132 std::string Result;
0133 llvm::raw_string_ostream OS(Result);
0134 switch (Language) {
0135 #define TESTLANGUAGE(lang, version, std_flag, version_index) \
0136 case Lang_##lang##version: \
0137 OS << (#lang #version); \
0138 break;
0139 #include "clang/Testing/TestLanguage.def"
0140 case Lang_OpenCL:
0141 OS << "OpenCL";
0142 break;
0143 case Lang_OBJC:
0144 OS << "OBJC";
0145 break;
0146 case Lang_OBJCXX:
0147 OS << "OBJCXX";
0148 break;
0149 }
0150
0151 OS << (Target.find("win") != std::string::npos ? "_win" : "");
0152 return Result;
0153 }
0154
0155 std::string toString() const {
0156 std::string Result;
0157 llvm::raw_string_ostream OS(Result);
0158 OS << "{ Language=" << Language << ", Target=" << Target << " }";
0159 return Result;
0160 }
0161
0162 friend std::ostream &operator<<(std::ostream &OS,
0163 const TestClangConfig &ClangConfig) {
0164 return OS << ClangConfig.toString();
0165 }
0166 };
0167
0168 }
0169
0170 #endif