]> granicus.if.org Git - clang/commitdiff
Don't emit exit-time destructor warnings for trivial explicitly defaulted dtors
authorStephan Tolksdorf <st@quanttec.com>
Thu, 27 Mar 2014 20:23:36 +0000 (20:23 +0000)
committerStephan Tolksdorf <st@quanttec.com>
Thu, 27 Mar 2014 20:23:36 +0000 (20:23 +0000)
This commit also adds an additional test case for the global destructor warning.

Reviewed in http://llvm-reviews.chandlerc.com/D3205

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@204954 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaDeclCXX.cpp
test/SemaCXX/warn-exit-time-destructors.cpp
test/SemaCXX/warn-global-constructors.cpp

index 919c74324a04a759c2bb552cc490fd5457352b8d..36a1541a232faba3affd33a654f698b85a8309b9 100644 (file)
@@ -10463,6 +10463,7 @@ void Sema::FinalizeVarWithDestructor(VarDecl *VD, const RecordType *Record) {
                         << VD->getType());
   DiagnoseUseOfDecl(Destructor, VD->getLocation());
 
+  if (Destructor->isTrivial()) return;
   if (!VD->hasGlobalStorage()) return;
 
   // Emit warning for non-trivial dtor in global scope (a real global,
@@ -10470,7 +10471,7 @@ void Sema::FinalizeVarWithDestructor(VarDecl *VD, const RecordType *Record) {
   Diag(VD->getLocation(), diag::warn_exit_time_destructor);
 
   // TODO: this should be re-enabled for static locals by !CXAAtExit
-  if (!Destructor->isTrivial() && !VD->isStaticLocal())
+  if (!VD->isStaticLocal())
     Diag(VD->getLocation(), diag::warn_global_destructor);
 }
 
index f49134b71c971afb21fede007fe79c2276e3bc99..124576aa95b6d74d690d96da712d77739b3e0d7b 100644 (file)
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -fsyntax-only -Wexit-time-destructors %s -verify
+// RUN: %clang_cc1 -std=c++11 -fsyntax-only -Wexit-time-destructors %s -verify
 
 namespace test1 {
   struct A { ~A(); };
@@ -23,5 +23,23 @@ void f() {
   static A &e = b[5];
   static A &f = c[5][7];
 }
+}
+
+namespace test3 {
+  struct A { ~A() = default; };
+  A a;
+
+  struct B { ~B(); };
+  struct C : B { ~C() = default; };
+  C c; // expected-warning {{exit-time destructor}}
 
+  class D {
+    friend struct E;
+    ~D() = default;
+  };
+  struct E : D {
+    D d;
+    ~E() = default;
+  };
+  E e;
 }
index b57a9c215f42d286dfb7a2123c755018f1c9f953..90d8558666c3b7a7a83f54bf520e6b92fbb8a7d8 100644 (file)
@@ -105,7 +105,18 @@ namespace referencemember {
 namespace pr19253 {
   struct A { ~A() = default; };
   A a;
-  struct B { ~B() {} };
+
+  struct B { ~B(); };
   struct C : B { ~C() = default; };
   C c; // expected-warning {{global destructor}}
+
+  class D {
+    friend struct E;
+    ~D() = default;
+  };
+  struct E : D {
+    D d;
+    ~E() = default;
+  };
+  E e;
 }