summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clang/include/clang/Basic/Diagnostic.h1
-rw-r--r--clang/lib/Basic/Diagnostic.cpp6
-rw-r--r--clang/test/Frontend/verify-unknown-arg.c6
3 files changed, 13 insertions, 0 deletions
diff --git a/clang/include/clang/Basic/Diagnostic.h b/clang/include/clang/Basic/Diagnostic.h
index 31a29fa2007..91e94db802b 100644
--- a/clang/include/clang/Basic/Diagnostic.h
+++ b/clang/include/clang/Basic/Diagnostic.h
@@ -347,6 +347,7 @@ public:
DiagnosticOptions *DiagOpts,
DiagnosticConsumer *client = nullptr,
bool ShouldOwnClient = true);
+ ~DiagnosticsEngine();
const IntrusiveRefCntPtr<DiagnosticIDs> &getDiagnosticIDs() const {
return Diags;
diff --git a/clang/lib/Basic/Diagnostic.cpp b/clang/lib/Basic/Diagnostic.cpp
index 5c066efa108..a8929466084 100644
--- a/clang/lib/Basic/Diagnostic.cpp
+++ b/clang/lib/Basic/Diagnostic.cpp
@@ -61,6 +61,12 @@ DiagnosticsEngine::DiagnosticsEngine(
Reset();
}
+DiagnosticsEngine::~DiagnosticsEngine() {
+ // If we own the diagnostic client, destroy it first so that it can access the
+ // engine from its destructor.
+ setClient(nullptr);
+}
+
void DiagnosticsEngine::setClient(DiagnosticConsumer *client,
bool ShouldOwnClient) {
Owner.reset(ShouldOwnClient ? client : nullptr);
diff --git a/clang/test/Frontend/verify-unknown-arg.c b/clang/test/Frontend/verify-unknown-arg.c
new file mode 100644
index 00000000000..5767daedca3
--- /dev/null
+++ b/clang/test/Frontend/verify-unknown-arg.c
@@ -0,0 +1,6 @@
+// RUN: not %clang_cc1 -asdf -verify %s 2>&1 | FileCheck %s
+
+// expected-no-diagnostics
+
+// CHECK: error: 'error' diagnostics seen but not expected:
+// CHECK-NEXT: (frontend): unknown argument: '-asdf'
OpenPOWER on IntegriCloud