Reland "[clang-repl] Allow passing in code as positional arguments."
authorVassil Vassilev <v.g.vassilev@gmail.com>
Sat, 10 Jul 2021 17:50:41 +0000 (17:50 +0000)
committerVassil Vassilev <v.g.vassilev@gmail.com>
Sat, 10 Jul 2021 17:54:00 +0000 (17:54 +0000)
This reverts commit 3ec88ca60b24 which reverted e386871e1d21 due to a asan build
failure.

This patch removes the new lines in the test case which seem to introduce the
failure.

Differential revision: https://reviews.llvm.org/D104898

clang/test/Interpreter/execute.cpp
clang/tools/clang-repl/ClangRepl.cpp

index 108b79b..298046c 100644 (file)
@@ -1,7 +1,9 @@
-// RUN: cat %s | clang-repl | FileCheck %s
+// RUN: clang-repl "int i = 10;" 'extern "C" int printf(const char*,...);' \
+// RUN:            'auto r1 = printf("i = %d\n", i);' | FileCheck --check-prefix=CHECK-DRIVER %s
 // REQUIRES: host-supports-jit
 // UNSUPPORTED: system-aix
-
+// CHECK-DRIVER: i = 10
+// RUN: cat %s | clang-repl | FileCheck %s
 extern "C" int printf(const char *, ...);
 int i = 42;
 auto r1 = printf("i = %d\n", i);
@@ -11,5 +13,4 @@ struct S { float f = 1.0; S *m = nullptr;} s;
 
 auto r2 = printf("S[f=%f, m=0x%llx]\n", s.f, reinterpret_cast<unsigned long long>(s.m));
 // CHECK-NEXT: S[f=1.000000, m=0x0]
-
 quit
index b5b5bf6..ba6bb11 100644 (file)
@@ -28,6 +28,9 @@ static llvm::cl::list<std::string>
               llvm::cl::CommaSeparated);
 static llvm::cl::opt<bool> OptHostSupportsJit("host-supports-jit",
                                               llvm::cl::Hidden);
+static llvm::cl::list<std::string> OptInputs(llvm::cl::Positional,
+                                             llvm::cl::ZeroOrMore,
+                                             llvm::cl::desc("[code to run]"));
 
 static void LLVMErrorHandler(void *UserData, const std::string &Message,
                              bool GenCrashDiag) {
@@ -78,15 +81,22 @@ int main(int argc, const char **argv) {
                                     static_cast<void *>(&CI->getDiagnostics()));
 
   auto Interp = ExitOnErr(clang::Interpreter::create(std::move(CI)));
-  llvm::LineEditor LE("clang-repl");
-  // FIXME: Add LE.setListCompleter
-  while (llvm::Optional<std::string> Line = LE.readLine()) {
-    if (*Line == "quit")
-      break;
-    if (auto Err = Interp->ParseAndExecute(*Line))
+  for (const std::string &input : OptInputs) {
+    if (auto Err = Interp->ParseAndExecute(input))
       llvm::logAllUnhandledErrors(std::move(Err), llvm::errs(), "error: ");
   }
 
+  if (OptInputs.empty()) {
+    llvm::LineEditor LE("clang-repl");
+    // FIXME: Add LE.setListCompleter
+    while (llvm::Optional<std::string> Line = LE.readLine()) {
+      if (*Line == "quit")
+        break;
+      if (auto Err = Interp->ParseAndExecute(*Line))
+        llvm::logAllUnhandledErrors(std::move(Err), llvm::errs(), "error: ");
+    }
+  }
+
   // Our error handler depends on the Diagnostics object, which we're
   // potentially about to delete. Uninstall the handler now so that any
   // later errors use the default handling behavior instead.