aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2011-01-31 22:04:05 +0000
committerDouglas Gregor <dgregor@apple.com>2011-01-31 22:04:05 +0000
commit4f5e21e24fb9e6ec473a13f83b5c9a2c41501a70 (patch)
tree9f120c36237ea7952616b01eb3f0dba564ea7b5c
parentc7a9cda0eb24762a3e9c892b1f4bdc6deb5de0a6 (diff)
Teach Diagnostic::setClient() to free the existing, owned
client. Fixes a libclang leak. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@124614 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/clang/Basic/Diagnostic.h5
-rw-r--r--lib/Basic/Diagnostic.cpp7
-rw-r--r--tools/c-index-test/c-index-test.c2
3 files changed, 10 insertions, 4 deletions
diff --git a/include/clang/Basic/Diagnostic.h b/include/clang/Basic/Diagnostic.h
index fd34fdec1e..19e7c91f53 100644
--- a/include/clang/Basic/Diagnostic.h
+++ b/include/clang/Basic/Diagnostic.h
@@ -335,10 +335,7 @@ public:
///
/// \param ShouldOwnClient true if the diagnostic object should take
/// ownership of \c client.
- void setClient(DiagnosticClient *client, bool ShouldOwnClient = true) {
- Client = client;
- OwnsDiagClient = ShouldOwnClient;
- }
+ void setClient(DiagnosticClient *client, bool ShouldOwnClient = true);
/// setErrorLimit - Specify a limit for the number of errors we should
/// emit before giving up. Zero disables the limit.
diff --git a/lib/Basic/Diagnostic.cpp b/lib/Basic/Diagnostic.cpp
index 9a263c1d0b..31e33315cc 100644
--- a/lib/Basic/Diagnostic.cpp
+++ b/lib/Basic/Diagnostic.cpp
@@ -62,6 +62,13 @@ Diagnostic::~Diagnostic() {
delete Client;
}
+void Diagnostic::setClient(DiagnosticClient *client, bool ShouldOwnClient) {
+ if (OwnsDiagClient && Client)
+ delete Client;
+
+ Client = client;
+ OwnsDiagClient = ShouldOwnClient;
+}
void Diagnostic::pushMappings(SourceLocation Loc) {
DiagStateOnPushStack.push_back(GetCurDiagState());
diff --git a/tools/c-index-test/c-index-test.c b/tools/c-index-test/c-index-test.c
index 808f4e9617..8c87d37651 100644
--- a/tools/c-index-test/c-index-test.c
+++ b/tools/c-index-test/c-index-test.c
@@ -827,6 +827,8 @@ static int perform_file_scan(const char *ast_file, const char *source_file,
}
fclose(fp);
+ clang_disposeTranslationUnit(TU);
+ clang_disposeIndex(Idx);
return 0;
}