diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index 1a5a4edfc505..919c74324a04 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -10470,7 +10470,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 (!VD->isStaticLocal()) + if (!Destructor->isTrivial() && !VD->isStaticLocal()) Diag(VD->getLocation(), diag::warn_global_destructor); } diff --git a/clang/test/SemaCXX/warn-global-constructors.cpp b/clang/test/SemaCXX/warn-global-constructors.cpp index f57f0de70812..b57a9c215f42 100644 --- a/clang/test/SemaCXX/warn-global-constructors.cpp +++ b/clang/test/SemaCXX/warn-global-constructors.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -fsyntax-only -Wglobal-constructors %s -verify +// RUN: %clang_cc1 -std=c++11 -fsyntax-only -Wglobal-constructors %s -verify int opaque_int(); @@ -101,3 +101,11 @@ namespace referencemember { int a; A b = { a }; } + +namespace pr19253 { + struct A { ~A() = default; }; + A a; + struct B { ~B() {} }; + struct C : B { ~C() = default; }; + C c; // expected-warning {{global destructor}} +}