diff --git a/clang/lib/CodeGen/CodeGenAction.cpp b/clang/lib/CodeGen/CodeGenAction.cpp --- a/clang/lib/CodeGen/CodeGenAction.cpp +++ b/clang/lib/CodeGen/CodeGenAction.cpp @@ -1115,6 +1115,14 @@ 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 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 --- a/llvm/include/llvm/IR/LLVMContext.h +++ b/llvm/include/llvm/IR/LLVMContext.h @@ -190,10 +190,11 @@ 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 &&DH, @@ -211,7 +212,7 @@ /// setDiagnosticHandler. const DiagnosticHandler *getDiagHandlerPtr() const; - /// getDiagnosticHandler - transfers owenership of DiagnosticHandler unique_ptr + /// getDiagnosticHandler - transfers ownership of DiagnosticHandler unique_ptr /// to caller. std::unique_ptr getDiagnosticHandler();