Index: tools/clang/lib/Tooling/Tooling.cpp
===================================================================
--- tools/clang/lib/Tooling/Tooling.cpp	(revision 157695)
+++ tools/clang/lib/Tooling/Tooling.cpp	(working copy)
@@ -193,17 +193,15 @@
   }
   llvm::OwningPtr<clang::CompilerInvocation> Invocation(
       newInvocation(&Diagnostics, *CC1Args));
-  return runInvocation(BinaryName, Compilation.get(),
-                       Invocation.take(), *CC1Args, ToolAction.take());
+  return runInvocation(BinaryName, Compilation.get(), Invocation.take(),
+                       *CC1Args);
 }
 
 bool ToolInvocation::runInvocation(
     const char *BinaryName,
     clang::driver::Compilation *Compilation,
     clang::CompilerInvocation *Invocation,
-    const clang::driver::ArgStringList &CC1Args,
-    clang::FrontendAction *ToolAction) {
-  llvm::OwningPtr<clang::FrontendAction> ScopedToolAction(ToolAction);
+    const clang::driver::ArgStringList &CC1Args) {
   // Show the invocation, with -v.
   if (Invocation->getHeaderSearchOpts().Verbose) {
     llvm::errs() << "clang Invocation:\n";
@@ -238,6 +236,10 @@
   const bool Success = Compiler.ExecuteAction(*ToolAction);
 
   Compiler.resetAndLeakFileManager();
+  // ToolAction can have lifetime requirements for CompilerInstance or its
+  // members, so we need to ensure it's deleted earlier.
+  ToolAction.reset(0);
+
   return Success;
 }
 
