Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-05-10 08:37:10

0001 //===--- TestClangConfig.h ------------------------------------------------===//
0002 //
0003 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
0004 // See https://llvm.org/LICENSE.txt for license information.
0005 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
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 /// A Clang configuration for end-to-end tests that can be converted to
0020 /// command line arguments for the driver.
0021 ///
0022 /// The configuration is represented as typed, named values, making it easier
0023 /// and safer to work with compared to an array of string command line flags.
0024 struct TestClangConfig {
0025   TestLanguage Language;
0026 
0027   /// The argument of the `-target` command line flag.
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 } // end namespace clang
0169 
0170 #endif