|  | 
|  | 1 | + | 
| 1 | 2 | #include "Utils.h" | 
| 2 | 3 | 
 | 
| 3 | 4 | #include "clang/Interpreter/CppInterOp.h" | 
|  | 5 | + | 
|  | 6 | +#ifdef USE_CLING | 
|  | 7 | +#include "cling/Interpreter/Interpreter.h" | 
|  | 8 | +#endif // USE_CLING | 
|  | 9 | + | 
|  | 10 | +#ifdef USE_REPL | 
|  | 11 | +#include "clang/Interpreter/Interpreter.h" | 
|  | 12 | +#endif // USE_REPL | 
|  | 13 | + | 
| 4 | 14 | #include "clang/Basic/Version.h" | 
| 5 | 15 | 
 | 
| 6 | 16 | #include "llvm/ADT/SmallString.h" | 
| @@ -162,3 +172,35 @@ TEST(InterpreterTest, CodeCompletion) { | 
| 162 | 172 |   GTEST_SKIP(); | 
| 163 | 173 | #endif | 
| 164 | 174 | } | 
|  | 175 | + | 
|  | 176 | +TEST(InterpreterTest, ExternalInterpreterTest) { | 
|  | 177 | + | 
|  | 178 | +#ifdef USE_REPL | 
|  | 179 | +  llvm::ExitOnError ExitOnErr; | 
|  | 180 | +  clang::IncrementalCompilerBuilder CB; | 
|  | 181 | +  CB.SetCompilerArgs({"-std=c++20"}); | 
|  | 182 | + | 
|  | 183 | +  // Create the incremental compiler instance. | 
|  | 184 | +  std::unique_ptr<clang::CompilerInstance> CI; | 
|  | 185 | +  CI = ExitOnErr(CB.CreateCpp()); | 
|  | 186 | + | 
|  | 187 | +  // Create the interpreter instance. | 
|  | 188 | +  std::unique_ptr<clang::Interpreter> I = | 
|  | 189 | +      ExitOnErr(clang::Interpreter::create(std::move(CI))); | 
|  | 190 | +#endif | 
|  | 191 | + | 
|  | 192 | +#ifdef USE_CLING | 
|  | 193 | +    std::string MainExecutableName = sys::fs::getMainExecutable(nullptr, nullptr); | 
|  | 194 | +    std::string ResourceDir = compat::MakeResourceDir(LLVM_BINARY_DIR); | 
|  | 195 | +    std::vector<const char *> ClingArgv = {"-resource-dir", ResourceDir.c_str(), | 
|  | 196 | +                                           "-std=c++14"}; | 
|  | 197 | +    ClingArgv.insert(ClingArgv.begin(), MainExecutableName.c_str()); | 
|  | 198 | +    std::unique_ptr<cling::Interpreter> I(ClingArgv.size(), &ClingArgv[0]); | 
|  | 199 | +#endif | 
|  | 200 | + | 
|  | 201 | +  auto ExtInterp = I.get(); | 
|  | 202 | +  EXPECT_NE(ExtInterp, nullptr); | 
|  | 203 | +  Cpp::UseExternalInterpreter(ExtInterp); | 
|  | 204 | +  EXPECT_FALSE(Cpp::OwnsInterpreter()); | 
|  | 205 | +  I.release(); | 
|  | 206 | +} | 
0 commit comments