From: Alexander Kornienko Date: Thu, 31 May 2012 17:58:43 +0000 (+0000) Subject: Fix an object lifetime issue in clang/Tooling. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=14a192435425af39e7f32b6e71613f9357e995f7;p=clang Fix an object lifetime issue in clang/Tooling. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@157759 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Tooling/Tooling.h b/include/clang/Tooling/Tooling.h index ecf14181de..0d9ffd123e 100644 --- a/include/clang/Tooling/Tooling.h +++ b/include/clang/Tooling/Tooling.h @@ -126,8 +126,7 @@ class ToolInvocation { bool runInvocation(const char *BinaryName, clang::driver::Compilation *Compilation, clang::CompilerInvocation *Invocation, - const clang::driver::ArgStringList &CC1Args, - clang::FrontendAction *ToolAction); + const clang::driver::ArgStringList &CC1Args); std::vector CommandLine; llvm::OwningPtr ToolAction; diff --git a/lib/Tooling/Tooling.cpp b/lib/Tooling/Tooling.cpp index 058d897f5d..50612cb982 100644 --- a/lib/Tooling/Tooling.cpp +++ b/lib/Tooling/Tooling.cpp @@ -193,17 +193,15 @@ bool ToolInvocation::run() { } llvm::OwningPtr 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 ScopedToolAction(ToolAction); + const clang::driver::ArgStringList &CC1Args) { // Show the invocation, with -v. if (Invocation->getHeaderSearchOpts().Verbose) { llvm::errs() << "clang Invocation:\n"; @@ -217,6 +215,11 @@ bool ToolInvocation::runInvocation( Compiler.setFileManager(Files); // FIXME: What about LangOpts? + // ToolAction can have lifetime requirements for Compiler or its members, and + // we need to ensure it's deleted earlier than Compiler. So we pass it to an + // OwningPtr declared after the Compiler variable. + llvm::OwningPtr ScopedToolAction(ToolAction.take()); + // Create the compilers actual diagnostics engine. Compiler.createDiagnostics(CC1Args.size(), const_cast(CC1Args.data())); @@ -235,7 +238,7 @@ bool ToolInvocation::runInvocation( clang::CompilerInvocation::GetResourcesPath(BinaryName, SymbolAddr); } - const bool Success = Compiler.ExecuteAction(*ToolAction); + const bool Success = Compiler.ExecuteAction(*ScopedToolAction); Compiler.resetAndLeakFileManager(); return Success;