From ded4d5630b205691bd73dac05ebd4f1ce1acc522 Mon Sep 17 00:00:00 2001 From: Stephan Tolksdorf Date: Thu, 27 Mar 2014 20:23:36 +0000 Subject: [PATCH] Don't emit exit-time destructor warnings for trivial explicitly defaulted dtors 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 | 3 ++- test/SemaCXX/warn-exit-time-destructors.cpp | 20 +++++++++++++++++++- test/SemaCXX/warn-global-constructors.cpp | 13 ++++++++++++- 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp index 919c74324a..36a1541a23 100644 --- a/lib/Sema/SemaDeclCXX.cpp +++ b/lib/Sema/SemaDeclCXX.cpp @@ -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); } diff --git a/test/SemaCXX/warn-exit-time-destructors.cpp b/test/SemaCXX/warn-exit-time-destructors.cpp index f49134b71c..124576aa95 100644 --- a/test/SemaCXX/warn-exit-time-destructors.cpp +++ b/test/SemaCXX/warn-exit-time-destructors.cpp @@ -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; } diff --git a/test/SemaCXX/warn-global-constructors.cpp b/test/SemaCXX/warn-global-constructors.cpp index b57a9c215f..90d8558666 100644 --- a/test/SemaCXX/warn-global-constructors.cpp +++ b/test/SemaCXX/warn-global-constructors.cpp @@ -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; } -- 2.40.0