Author: Marco Antognini Date: 2021-02-15T10:33:00Z New Revision: e54811ff7e0bc99f337bcbb569311bb166187322
URL: https://github.com/llvm/llvm-project/commit/e54811ff7e0bc99f337bcbb569311bb166187322 DIFF: https://github.com/llvm/llvm-project/commit/e54811ff7e0bc99f337bcbb569311bb166187322.diff LOG: Restore diagnostic handler after CodeGenAction::ExecuteAction Fix dangling pointer to local variable and address some typos. Reviewed By: xur Differential Revision: https://reviews.llvm.org/D96487 Added: Modified: clang/lib/CodeGen/CodeGenAction.cpp llvm/include/llvm/IR/LLVMContext.h Removed: ################################################################################ diff --git a/clang/lib/CodeGen/CodeGenAction.cpp b/clang/lib/CodeGen/CodeGenAction.cpp index 778d4df3c2e9..da352463450b 100644 --- a/clang/lib/CodeGen/CodeGenAction.cpp +++ b/clang/lib/CodeGen/CodeGenAction.cpp @@ -1115,6 +1115,14 @@ void CodeGenAction::ExecuteAction() { LLVMContext &Ctx = TheModule->getContext(); Ctx.setInlineAsmDiagnosticHandler(BitcodeInlineAsmDiagHandler, &Diagnostics); + // Restore any diagnostic handler previously set before returning from this + // function. + struct RAII { + LLVMContext &Ctx; + std::unique_ptr<DiagnosticHandler> PrevHandler = Ctx.getDiagnosticHandler(); + ~RAII() { Ctx.setDiagnosticHandler(std::move(PrevHandler)); } + } _{Ctx}; + // Set clang diagnostic handler. To do this we need to create a fake // BackendConsumer. BackendConsumer Result(BA, CI.getDiagnostics(), CI.getHeaderSearchOpts(), diff --git a/llvm/include/llvm/IR/LLVMContext.h b/llvm/include/llvm/IR/LLVMContext.h index 1195a9e5fb28..a352deda6bc8 100644 --- a/llvm/include/llvm/IR/LLVMContext.h +++ b/llvm/include/llvm/IR/LLVMContext.h @@ -190,10 +190,11 @@ class LLVMContext { DiagnosticHandler::DiagnosticHandlerTy DiagHandler, void *DiagContext = nullptr, bool RespectFilters = false); - /// setDiagnosticHandler - This method sets unique_ptr to object of DiagnosticHandler - /// to provide custom diagnostic handling. The first argument is unique_ptr of object - /// of type DiagnosticHandler or a derived of that. The third argument should be - /// set to true if the handler only expects enabled diagnostics. + /// setDiagnosticHandler - This method sets unique_ptr to object of + /// DiagnosticHandler to provide custom diagnostic handling. The first + /// argument is unique_ptr of object of type DiagnosticHandler or a derived + /// of that. The second argument should be set to true if the handler only + /// expects enabled diagnostics. /// /// Ownership of this pointer is moved to LLVMContextImpl. void setDiagnosticHandler(std::unique_ptr<DiagnosticHandler> &&DH, @@ -211,7 +212,7 @@ class LLVMContext { /// setDiagnosticHandler. const DiagnosticHandler *getDiagHandlerPtr() const; - /// getDiagnosticHandler - transfers owenership of DiagnosticHandler unique_ptr + /// getDiagnosticHandler - transfers ownership of DiagnosticHandler unique_ptr /// to caller. std::unique_ptr<DiagnosticHandler> getDiagnosticHandler(); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits