diff options
-rw-r--r-- | lib/Sema/SemaDeclCXX.cpp | 4 | ||||
-rw-r--r-- | test/SemaCXX/destructor.cpp | 12 |
2 files changed, 14 insertions, 2 deletions
diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp index 89332eae0e..c6ffcc759e 100644 --- a/lib/Sema/SemaDeclCXX.cpp +++ b/lib/Sema/SemaDeclCXX.cpp @@ -2770,10 +2770,10 @@ void Sema::CheckCompletedCXXClass(CXXRecordDecl *Record) { } } - // Warn if the class has virtual methods but non-virtual destructor. + // Warn if the class has virtual methods but non-virtual public destructor. if (Record->isDynamicClass()) { CXXDestructorDecl *dtor = Record->getDestructor(); - if (!(dtor && dtor->isVirtual())) + if (!dtor || (!dtor->isVirtual() && dtor->getAccess() == AS_public)) Diag(dtor ? dtor->getLocation() : Record->getLocation(), diag::warn_non_virtual_dtor) << Context.getRecordType(Record); } diff --git a/test/SemaCXX/destructor.cpp b/test/SemaCXX/destructor.cpp index a86859c62d..ce01b3acc5 100644 --- a/test/SemaCXX/destructor.cpp +++ b/test/SemaCXX/destructor.cpp @@ -147,4 +147,16 @@ struct B { struct S5 : public B { virtual void m(); }; + +struct S6 { + virtual void m(); +private: + ~S6(); +}; + +struct S7 { + virtual void m(); +protected: + ~S7(); +}; } |