diff options
| -rw-r--r-- | clang/lib/Sema/SemaDeclCXX.cpp | 3 | ||||
| -rw-r--r-- | clang/test/SemaCXX/warn-exit-time-destructors.cpp | 20 | ||||
| -rw-r--r-- | clang/test/SemaCXX/warn-global-constructors.cpp | 13 |
3 files changed, 33 insertions, 3 deletions
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index 919c74324a0..36a1541a232 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/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/clang/test/SemaCXX/warn-exit-time-destructors.cpp b/clang/test/SemaCXX/warn-exit-time-destructors.cpp index f49134b71c9..124576aa95b 100644 --- a/clang/test/SemaCXX/warn-exit-time-destructors.cpp +++ b/clang/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/clang/test/SemaCXX/warn-global-constructors.cpp b/clang/test/SemaCXX/warn-global-constructors.cpp index b57a9c215f4..90d8558666c 100644 --- a/clang/test/SemaCXX/warn-global-constructors.cpp +++ b/clang/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; } |

