1 //===--- TestClangConfig.h ------------------------------------------------===// 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_TESTING_TESTCLANGCONFIG_H 10 #define LLVM_CLANG_TESTING_TESTCLANGCONFIG_H 11 12 #include "clang/Testing/CommandLineArgs.h" 13 #include "llvm/Support/raw_ostream.h" 14 #include <string> 15 #include <vector> 16 17 namespace clang { 18 19 /// A Clang configuration for end-to-end tests that can be converted to 20 /// command line arguments for the driver. 21 /// 22 /// The configuration is represented as typed, named values, making it easier 23 /// and safer to work with compared to an array of string command line flags. 24 struct TestClangConfig { 25 TestLanguage Language; 26 27 /// The argument of the `-target` command line flag. 28 std::string Target; 29 isCTestClangConfig30 bool isC() const { return Language == Lang_C89 || Language == Lang_C99; } 31 isC99OrLaterTestClangConfig32 bool isC99OrLater() const { return Language == Lang_C99; } 33 isCXXTestClangConfig34 bool isCXX() const { 35 return Language == Lang_CXX03 || Language == Lang_CXX11 || 36 Language == Lang_CXX14 || Language == Lang_CXX17 || 37 Language == Lang_CXX20; 38 } 39 isCXX11OrLaterTestClangConfig40 bool isCXX11OrLater() const { 41 return Language == Lang_CXX11 || Language == Lang_CXX14 || 42 Language == Lang_CXX17 || Language == Lang_CXX20; 43 } 44 isCXX14OrLaterTestClangConfig45 bool isCXX14OrLater() const { 46 return Language == Lang_CXX14 || Language == Lang_CXX17 || 47 Language == Lang_CXX20; 48 } 49 isCXX17OrLaterTestClangConfig50 bool isCXX17OrLater() const { 51 return Language == Lang_CXX17 || Language == Lang_CXX20; 52 } 53 isCXX20OrLaterTestClangConfig54 bool isCXX20OrLater() const { return Language == Lang_CXX20; } 55 supportsCXXDynamicExceptionSpecificationTestClangConfig56 bool supportsCXXDynamicExceptionSpecification() const { 57 return Language == Lang_CXX03 || Language == Lang_CXX11 || 58 Language == Lang_CXX14; 59 } 60 hasDelayedTemplateParsingTestClangConfig61 bool hasDelayedTemplateParsing() const { 62 return Target == "x86_64-pc-win32-msvc"; 63 } 64 getCommandLineArgsTestClangConfig65 std::vector<std::string> getCommandLineArgs() const { 66 std::vector<std::string> Result = getCommandLineArgsForTesting(Language); 67 Result.push_back("-target"); 68 Result.push_back(Target); 69 return Result; 70 } 71 toStringTestClangConfig72 std::string toString() const { 73 std::string Result; 74 llvm::raw_string_ostream OS(Result); 75 OS << "{ Language=" << Language << ", Target=" << Target << " }"; 76 return OS.str(); 77 } 78 79 friend std::ostream &operator<<(std::ostream &OS, 80 const TestClangConfig &ClangConfig) { 81 return OS << ClangConfig.toString(); 82 } 83 }; 84 85 } // end namespace clang 86 87 #endif 88