summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clang/lib/Sema/SemaDeclCXX.cpp4
-rw-r--r--clang/test/SemaCXX/destructor.cpp12
2 files changed, 14 insertions, 2 deletions
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index 89332eae0e0..c6ffcc759ec 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/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/clang/test/SemaCXX/destructor.cpp b/clang/test/SemaCXX/destructor.cpp
index a86859c62d9..ce01b3acc5a 100644
--- a/clang/test/SemaCXX/destructor.cpp
+++ b/clang/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();
+};
}
OpenPOWER on IntegriCloud