Skip to content

Commit

Permalink
Make DiagnosticsEngine::takeClient return std::unique_ptr<>
Browse files Browse the repository at this point in the history
Summary:
Make DiagnosticsEngine::takeClient return std::unique_ptr<>. Updated
callers to store conditional ownership using a pair of pointer and unique_ptr
instead of a pointer + bool. Updated code that temporarily registers clients to
use the non-owning registration (+ removed extra calls to takeClient).

Reviewers: dblaikie

Reviewed By: dblaikie

Subscribers: cfe-commits

Differential Revision: http://reviews.llvm.org/D6294

llvm-svn: 222193
  • Loading branch information
alexfh committed Nov 17, 2014
1 parent d60b82f commit 41c247a
Show file tree
Hide file tree
Showing 10 changed files with 34 additions and 58 deletions.
12 changes: 4 additions & 8 deletions clang/include/clang/Basic/Diagnostic.h
Expand Up @@ -187,7 +187,7 @@ class DiagnosticsEngine : public RefCountedBase<DiagnosticsEngine> {
IntrusiveRefCntPtr<DiagnosticIDs> Diags;
IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts;
DiagnosticConsumer *Client;
bool OwnsDiagClient;
std::unique_ptr<DiagnosticConsumer> Owner;
SourceManager *SourceMgr;

/// \brief Mapping information for diagnostics.
Expand Down Expand Up @@ -347,7 +347,6 @@ class DiagnosticsEngine : public RefCountedBase<DiagnosticsEngine> {
DiagnosticOptions *DiagOpts,
DiagnosticConsumer *client = nullptr,
bool ShouldOwnClient = true);
~DiagnosticsEngine();

const IntrusiveRefCntPtr<DiagnosticIDs> &getDiagnosticIDs() const {
return Diags;
Expand All @@ -368,14 +367,11 @@ class DiagnosticsEngine : public RefCountedBase<DiagnosticsEngine> {
const DiagnosticConsumer *getClient() const { return Client; }

/// \brief Determine whether this \c DiagnosticsEngine object own its client.
bool ownsClient() const { return OwnsDiagClient; }
bool ownsClient() const { return Owner != nullptr; }

/// \brief Return the current diagnostic client along with ownership of that
/// client.
DiagnosticConsumer *takeClient() {
OwnsDiagClient = false;
return Client;
}
std::unique_ptr<DiagnosticConsumer> takeClient() { return std::move(Owner); }

bool hasSourceManager() const { return SourceMgr != nullptr; }
SourceManager &getSourceManager() const {
Expand Down
2 changes: 1 addition & 1 deletion clang/include/clang/Frontend/VerifyDiagnosticConsumer.h
Expand Up @@ -212,7 +212,7 @@ class VerifyDiagnosticConsumer: public DiagnosticConsumer,
private:
DiagnosticsEngine &Diags;
DiagnosticConsumer *PrimaryClient;
bool OwnsPrimaryClient;
std::unique_ptr<DiagnosticConsumer> PrimaryClientOwner;
std::unique_ptr<TextDiagnosticBuffer> Buffer;
const Preprocessor *CurrentPreprocessor;
const LangOptions *LangOpts;
Expand Down
2 changes: 1 addition & 1 deletion clang/include/clang/Rewrite/Frontend/FixItRewriter.h
Expand Up @@ -66,7 +66,7 @@ class FixItRewriter : public DiagnosticConsumer {
/// \brief The diagnostic client that performs the actual formatting
/// of error messages.
DiagnosticConsumer *Client;
bool OwnsClient;
std::unique_ptr<DiagnosticConsumer> Owner;

/// \brief Turn an input path into an output path. NULL implies overwriting
/// the original.
Expand Down
20 changes: 5 additions & 15 deletions clang/lib/Basic/Diagnostic.cpp
Expand Up @@ -33,13 +33,11 @@ static void DummyArgToStringFn(DiagnosticsEngine::ArgumentKind AK, intptr_t QT,
Output.append(Str.begin(), Str.end());
}


DiagnosticsEngine::DiagnosticsEngine(
const IntrusiveRefCntPtr<DiagnosticIDs> &diags,
DiagnosticOptions *DiagOpts,
DiagnosticConsumer *client, bool ShouldOwnClient)
: Diags(diags), DiagOpts(DiagOpts), Client(client),
OwnsDiagClient(ShouldOwnClient), SourceMgr(nullptr) {
const IntrusiveRefCntPtr<DiagnosticIDs> &diags, DiagnosticOptions *DiagOpts,
DiagnosticConsumer *client, bool ShouldOwnClient)
: Diags(diags), DiagOpts(DiagOpts), Client(nullptr), SourceMgr(nullptr) {
setClient(client, ShouldOwnClient);
ArgToStringFn = DummyArgToStringFn;
ArgToStringCookie = nullptr;

Expand All @@ -63,18 +61,10 @@ DiagnosticsEngine::DiagnosticsEngine(
Reset();
}

DiagnosticsEngine::~DiagnosticsEngine() {
if (OwnsDiagClient)
delete Client;
}

void DiagnosticsEngine::setClient(DiagnosticConsumer *client,
bool ShouldOwnClient) {
if (OwnsDiagClient && Client)
delete Client;

Owner.reset(ShouldOwnClient ? client : nullptr);
Client = client;
OwnsDiagClient = ShouldOwnClient;
}

void DiagnosticsEngine::pushMappings(SourceLocation Loc) {
Expand Down
12 changes: 6 additions & 6 deletions clang/lib/Frontend/ASTUnit.cpp
Expand Up @@ -589,23 +589,23 @@ class CaptureDroppedDiagnostics {
DiagnosticsEngine &Diags;
StoredDiagnosticConsumer Client;
DiagnosticConsumer *PreviousClient;
std::unique_ptr<DiagnosticConsumer> OwningPreviousClient;

public:
CaptureDroppedDiagnostics(bool RequestCapture, DiagnosticsEngine &Diags,
SmallVectorImpl<StoredDiagnostic> &StoredDiags)
: Diags(Diags), Client(StoredDiags), PreviousClient(nullptr)
{
if (RequestCapture || Diags.getClient() == nullptr) {
PreviousClient = Diags.takeClient();
Diags.setClient(&Client);
OwningPreviousClient = Diags.takeClient();
PreviousClient = Diags.getClient();
Diags.setClient(&Client, false);
}
}

~CaptureDroppedDiagnostics() {
if (Diags.getClient() == &Client) {
Diags.takeClient();
Diags.setClient(PreviousClient);
}
if (Diags.getClient() == &Client)
Diags.setClient(PreviousClient, !!OwningPreviousClient.release());
}
};

Expand Down
8 changes: 3 additions & 5 deletions clang/lib/Frontend/CompilerInstance.cpp
Expand Up @@ -159,9 +159,8 @@ static void SetUpDiagnosticLog(DiagnosticOptions *DiagOpts,
if (CodeGenOpts)
Logger->setDwarfDebugFlags(CodeGenOpts->DwarfDebugFlags);
assert(Diags.ownsClient());
Diags.setClient(new ChainedDiagnosticConsumer(
std::unique_ptr<DiagnosticConsumer>(Diags.takeClient()),
std::move(Logger)));
Diags.setClient(
new ChainedDiagnosticConsumer(Diags.takeClient(), std::move(Logger)));
}

static void SetupSerializedDiagnostics(DiagnosticOptions *DiagOpts,
Expand All @@ -172,8 +171,7 @@ static void SetupSerializedDiagnostics(DiagnosticOptions *DiagOpts,

if (Diags.ownsClient()) {
Diags.setClient(new ChainedDiagnosticConsumer(
std::unique_ptr<DiagnosticConsumer>(Diags.takeClient()),
std::move(SerializedConsumer)));
Diags.takeClient(), std::move(SerializedConsumer)));
} else {
Diags.setClient(new ChainedDiagnosticConsumer(
Diags.getClient(), std::move(SerializedConsumer)));
Expand Down
15 changes: 6 additions & 9 deletions clang/lib/Frontend/Rewrite/FixItRewriter.cpp
Expand Up @@ -36,14 +36,13 @@ FixItRewriter::FixItRewriter(DiagnosticsEngine &Diags, SourceManager &SourceMgr,
FixItOpts(FixItOpts),
NumFailures(0),
PrevDiagSilenced(false) {
OwnsClient = Diags.ownsClient();
Client = Diags.takeClient();
Diags.setClient(this);
Owner = Diags.takeClient();
Client = Diags.getClient();
Diags.setClient(this, false);
}

FixItRewriter::~FixItRewriter() {
Diags.takeClient();
Diags.setClient(Client, OwnsClient);
Diags.setClient(Client, Owner.release() != nullptr);
}

bool FixItRewriter::WriteFixedFile(FileID ID, raw_ostream &OS) {
Expand Down Expand Up @@ -188,12 +187,10 @@ void FixItRewriter::Diag(SourceLocation Loc, unsigned DiagID) {
// When producing this diagnostic, we temporarily bypass ourselves,
// clear out any current diagnostic, and let the downstream client
// format the diagnostic.
Diags.takeClient();
Diags.setClient(Client);
Diags.setClient(Client, false);
Diags.Clear();
Diags.Report(Loc, DiagID);
Diags.takeClient();
Diags.setClient(this);
Diags.setClient(this, false);
}

FixItOptions::~FixItOptions() {}
16 changes: 6 additions & 10 deletions clang/lib/Frontend/VerifyDiagnosticConsumer.cpp
Expand Up @@ -29,12 +29,11 @@ typedef VerifyDiagnosticConsumer::ExpectedData ExpectedData;

VerifyDiagnosticConsumer::VerifyDiagnosticConsumer(DiagnosticsEngine &Diags_)
: Diags(Diags_),
PrimaryClient(Diags.getClient()), OwnsPrimaryClient(Diags.ownsClient()),
PrimaryClient(Diags.getClient()), PrimaryClientOwner(Diags.takeClient()),
Buffer(new TextDiagnosticBuffer()), CurrentPreprocessor(nullptr),
LangOpts(nullptr), SrcManager(nullptr), ActiveSourceFiles(0),
Status(HasNoDirectives)
{
Diags.takeClient();
if (Diags.hasSourceManager())
setSourceManager(Diags.getSourceManager());
}
Expand All @@ -43,10 +42,8 @@ VerifyDiagnosticConsumer::~VerifyDiagnosticConsumer() {
assert(!ActiveSourceFiles && "Incomplete parsing of source files!");
assert(!CurrentPreprocessor && "CurrentPreprocessor should be invalid!");
SrcManager = nullptr;
CheckDiagnostics();
Diags.takeClient();
if (OwnsPrimaryClient)
delete PrimaryClient;
CheckDiagnostics();
Diags.takeClient().release();
}

#ifndef NDEBUG
Expand Down Expand Up @@ -802,8 +799,8 @@ void VerifyDiagnosticConsumer::UpdateParsedFileStatus(SourceManager &SM,

void VerifyDiagnosticConsumer::CheckDiagnostics() {
// Ensure any diagnostics go to the primary client.
bool OwnsCurClient = Diags.ownsClient();
DiagnosticConsumer *CurClient = Diags.takeClient();
DiagnosticConsumer *CurClient = Diags.getClient();
std::unique_ptr<DiagnosticConsumer> Owner = Diags.takeClient();
Diags.setClient(PrimaryClient, false);

#ifndef NDEBUG
Expand Down Expand Up @@ -865,8 +862,7 @@ void VerifyDiagnosticConsumer::CheckDiagnostics() {
Buffer->note_end(), "note"));
}

Diags.takeClient();
Diags.setClient(CurClient, OwnsCurClient);
Diags.setClient(CurClient, Owner.release() != nullptr);

// Reset the buffer, we have processed all the diagnostics in it.
Buffer.reset(new TextDiagnosticBuffer());
Expand Down
3 changes: 1 addition & 2 deletions clang/tools/driver/driver.cpp
Expand Up @@ -451,8 +451,7 @@ int main(int argc_, const char **argv_) {
clang::serialized_diags::create(DiagOpts->DiagnosticSerializationFile,
&*DiagOpts, /*MergeChildRecords=*/true);
Diags.setClient(new ChainedDiagnosticConsumer(
std::unique_ptr<DiagnosticConsumer>(Diags.takeClient()),
std::move(SerializedConsumer)));
Diags.takeClient(), std::move(SerializedConsumer)));
}

ProcessWarningOptions(Diags, *DiagOpts, /*ReportDiags=*/false);
Expand Down
2 changes: 1 addition & 1 deletion clang/unittests/Sema/ExternalSemaSourceTest.cpp
Expand Up @@ -154,7 +154,7 @@ class ExternalSemaSourceInstaller : public clang::ASTFrontendAction {
DiagnosticsEngine &Diagnostics = CI.getDiagnostics();
DiagnosticConsumer *Client = Diagnostics.getClient();
if (Diagnostics.ownsClient())
OwnedClient.reset(Diagnostics.takeClient());
OwnedClient = Diagnostics.takeClient();
for (size_t I = 0, E = Watchers.size(); I < E; ++I)
Client = Watchers[I]->Chain(Client);
Diagnostics.setClient(Client, false);
Expand Down

0 comments on commit 41c247a

Please sign in to comment.