]> granicus.if.org Git - clang/commitdiff
Don't warn for -Wnon-virtual-dtor for dependent classes.
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>
Wed, 2 Feb 2011 18:47:41 +0000 (18:47 +0000)
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>
Wed, 2 Feb 2011 18:47:41 +0000 (18:47 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@124735 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaDeclCXX.cpp
test/SemaCXX/destructor.cpp

index c6ffcc759ecbe18cedd325fb3c2c67fbb672a614..b4c375d638a61d5182d5e2d82b5a86f11cd6e594 100644 (file)
@@ -2771,7 +2771,7 @@ void Sema::CheckCompletedCXXClass(CXXRecordDecl *Record) {
   }
 
   // Warn if the class has virtual methods but non-virtual public destructor.
-  if (Record->isDynamicClass()) {
+  if (Record->isDynamicClass() && !Record->isDependentType()) {
     CXXDestructorDecl *dtor = Record->getDestructor();
     if (!dtor || (!dtor->isVirtual() && dtor->getAccess() == AS_public))
       Diag(dtor ? dtor->getLocation() : Record->getLocation(),
index ce01b3acc5a5d1b63eb834cd9ba23c6a0c9b59f9..ec437f7101e47b53c09ddec48552018132297feb 100644 (file)
@@ -159,4 +159,16 @@ struct S7 {
 protected:
   ~S7();
 };
+
+template<class T> class TS : public B {
+  virtual void m();
+};
+
+TS<int> baz;
+
+template<class T> class TS2 { // expected-warning {{'nonvirtualdtor::TS2<int>' has virtual functions but non-virtual destructor}}
+  virtual void m();
+};
+
+TS2<int> foo; // expected-note {{instantiation}}
 }