Make Diagnostic reference-counted, which is simpler than juggling
maybe-ownership vs. ownership.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@100498 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Frontend/ASTMerge.cpp b/lib/Frontend/ASTMerge.cpp
index 2465861..b0faf0a 100644
--- a/lib/Frontend/ASTMerge.cpp
+++ b/lib/Frontend/ASTMerge.cpp
@@ -12,6 +12,7 @@
#include "clang/AST/ASTContext.h"
#include "clang/AST/ASTDiagnostic.h"
#include "clang/AST/ASTImporter.h"
+#include "clang/Basic/Diagnostic.h"
using namespace clang;
@@ -36,10 +37,9 @@
CI.getASTContext().getLangOptions());
CI.getDiagnostics().SetArgToStringFn(&FormatASTNodeDiagnosticArgument,
&CI.getASTContext());
+ llvm::IntrusiveRefCntPtr<Diagnostic> Diags(&CI.getDiagnostics());
for (unsigned I = 0, N = ASTFiles.size(); I != N; ++I) {
- ASTUnit *Unit = ASTUnit::LoadFromPCHFile(ASTFiles[I],
- UnownedDiag(CI.getDiagnostics()),
- false);
+ ASTUnit *Unit = ASTUnit::LoadFromPCHFile(ASTFiles[I], Diags, false);
if (!Unit)
continue;
diff --git a/lib/Frontend/ASTUnit.cpp b/lib/Frontend/ASTUnit.cpp
index 2a76d6f..427bd6a 100644
--- a/lib/Frontend/ASTUnit.cpp
+++ b/lib/Frontend/ASTUnit.cpp
@@ -141,24 +141,22 @@
}
ASTUnit *ASTUnit::LoadFromPCHFile(const std::string &Filename,
- llvm::MaybeOwningPtr<Diagnostic> Diags,
+ llvm::IntrusiveRefCntPtr<Diagnostic> Diags,
bool OnlyLocalDecls,
RemappedFile *RemappedFiles,
unsigned NumRemappedFiles,
bool CaptureDiagnostics) {
llvm::OwningPtr<ASTUnit> AST(new ASTUnit(true));
- if (Diags.get())
- AST->Diagnostics = Diags;
- else {
+ if (!Diags.getPtr()) {
// No diagnostics engine was provided, so create our own diagnostics object
// with the default options.
DiagnosticOptions DiagOpts;
- AST->Diagnostics.reset(CompilerInstance::createDiagnostics(DiagOpts, 0, 0),
- true);
+ Diags = CompilerInstance::createDiagnostics(DiagOpts, 0, 0);
}
AST->OnlyLocalDecls = OnlyLocalDecls;
+ AST->Diagnostics = Diags;
AST->FileMgr.reset(new FileManager);
AST->SourceMgr.reset(new SourceManager(AST->getDiagnostics()));
AST->HeaderInfo.reset(new HeaderSearch(AST->getFileManager()));
@@ -290,7 +288,7 @@
}
ASTUnit *ASTUnit::LoadFromCompilerInvocation(CompilerInvocation *CI,
- llvm::MaybeOwningPtr<Diagnostic> Diags,
+ llvm::IntrusiveRefCntPtr<Diagnostic> Diags,
bool OnlyLocalDecls,
bool CaptureDiagnostics) {
// Create the compiler instance to use for building the AST.
@@ -298,16 +296,16 @@
llvm::OwningPtr<ASTUnit> AST;
llvm::OwningPtr<TopLevelDeclTrackerAction> Act;
- if (!Diags.get()) {
+ if (!Diags.getPtr()) {
// No diagnostics engine was provided, so create our own diagnostics object
// with the default options.
DiagnosticOptions DiagOpts;
- Diags.reset(CompilerInstance::createDiagnostics(DiagOpts, 0, 0), true);
+ Diags = CompilerInstance::createDiagnostics(DiagOpts, 0, 0);
}
Clang.setInvocation(CI);
- Clang.setDiagnostics(Diags.get());
+ Clang.setDiagnostics(Diags.getPtr());
Clang.setDiagnosticClient(Diags->getClient());
// Create the target instance.
@@ -315,7 +313,6 @@
Clang.getTargetOpts()));
if (!Clang.hasTarget()) {
Clang.takeDiagnosticClient();
- Clang.takeDiagnostics();
return 0;
}
@@ -370,7 +367,6 @@
Act->EndSourceFile();
Clang.takeDiagnosticClient();
- Clang.takeDiagnostics();
Clang.takeInvocation();
AST->Invocation.reset(Clang.takeInvocation());
@@ -380,23 +376,22 @@
Clang.takeSourceManager();
Clang.takeFileManager();
Clang.takeDiagnosticClient();
- Clang.takeDiagnostics();
return 0;
}
ASTUnit *ASTUnit::LoadFromCommandLine(const char **ArgBegin,
const char **ArgEnd,
- llvm::MaybeOwningPtr<Diagnostic> Diags,
+ llvm::IntrusiveRefCntPtr<Diagnostic> Diags,
llvm::StringRef ResourceFilesPath,
bool OnlyLocalDecls,
RemappedFile *RemappedFiles,
unsigned NumRemappedFiles,
bool CaptureDiagnostics) {
- if (!Diags.get()) {
+ if (!Diags.getPtr()) {
// No diagnostics engine was provided, so create our own diagnostics object
// with the default options.
DiagnosticOptions DiagOpts;
- Diags.reset(CompilerInstance::createDiagnostics(DiagOpts, 0, 0), true);
+ Diags = CompilerInstance::createDiagnostics(DiagOpts, 0, 0);
}
llvm::SmallVector<const char *, 16> Args;
diff --git a/lib/Frontend/CompilerInstance.cpp b/lib/Frontend/CompilerInstance.cpp
index 879e9f6..1f915e3 100644
--- a/lib/Frontend/CompilerInstance.cpp
+++ b/lib/Frontend/CompilerInstance.cpp
@@ -52,7 +52,7 @@
}
void CompilerInstance::setDiagnostics(Diagnostic *Value) {
- Diagnostics.reset(Value);
+ Diagnostics = Value;
}
void CompilerInstance::setDiagnosticClient(DiagnosticClient *Value) {
@@ -130,15 +130,16 @@
}
void CompilerInstance::createDiagnostics(int Argc, char **Argv) {
- Diagnostics.reset(createDiagnostics(getDiagnosticOpts(), Argc, Argv));
+ Diagnostics = createDiagnostics(getDiagnosticOpts(), Argc, Argv);
if (Diagnostics)
DiagClient.reset(Diagnostics->getClient());
}
-Diagnostic *CompilerInstance::createDiagnostics(const DiagnosticOptions &Opts,
- int Argc, char **Argv) {
- llvm::OwningPtr<Diagnostic> Diags(new Diagnostic());
+llvm::IntrusiveRefCntPtr<Diagnostic>
+CompilerInstance::createDiagnostics(const DiagnosticOptions &Opts,
+ int Argc, char **Argv) {
+ llvm::IntrusiveRefCntPtr<Diagnostic> Diags(new Diagnostic());
// Create the diagnostic client for reporting errors or for
// implementing -verify.
@@ -152,7 +153,7 @@
DiagClient.reset(new TextDiagnosticPrinter(llvm::errs(), Opts));
Diags->setClient(DiagClient.take());
Diags->Report(diag::err_fe_stderr_binary);
- return Diags.take();
+ return Diags;
} else {
DiagClient.reset(new BinaryDiagnosticSerializer(llvm::errs()));
}
@@ -171,7 +172,7 @@
// Configure our handling of diagnostics.
ProcessWarningOptions(*Diags, Opts);
- return Diags.take();
+ return Diags;
}
// File Manager
diff --git a/lib/Frontend/FrontendAction.cpp b/lib/Frontend/FrontendAction.cpp
index 464b589..87fc122 100644
--- a/lib/Frontend/FrontendAction.cpp
+++ b/lib/Frontend/FrontendAction.cpp
@@ -45,9 +45,9 @@
"Attempt to pass AST file to preprocessor only action!");
assert(hasASTSupport() && "This action does not have AST support!");
+ llvm::IntrusiveRefCntPtr<Diagnostic> Diags(&CI.getDiagnostics());
std::string Error;
- ASTUnit *AST = ASTUnit::LoadFromPCHFile(Filename,
- UnownedDiag(CI.getDiagnostics()));
+ ASTUnit *AST = ASTUnit::LoadFromPCHFile(Filename, Diags);
if (!AST)
goto failure;