]> granicus.if.org Git - clang/commitdiff
Correctly calcluate abstract-ness in the case where an implicitly declared
authorEli Friedman <eli.friedman@gmail.com>
Wed, 16 Dec 2009 20:00:27 +0000 (20:00 +0000)
committerEli Friedman <eli.friedman@gmail.com>
Wed, 16 Dec 2009 20:00:27 +0000 (20:00 +0000)
method overrides a pure virtual method.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@91558 91177308-0d34-0410-b5e6-96231b3b80d8

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

index 091c0384460e941cc9b8f158db0164408f253ce3..afddd9f02cb73511ef8d6c3572cd02c0327e9971 100644 (file)
@@ -1979,6 +1979,12 @@ void Sema::CheckCompletedCXXClass(CXXRecordDecl *Record) {
   if (!Record || Record->isInvalidDecl())
     return;
 
+  if (!Record->isDependentType())
+    AddImplicitlyDeclaredMembersToClass(Record);
+
+  if (Record->isInvalidDecl())
+    return;
+
   if (!Record->isAbstract()) {
     // Collect all the pure virtual methods and see if this is an abstract
     // class after all.
@@ -1989,9 +1995,6 @@ void Sema::CheckCompletedCXXClass(CXXRecordDecl *Record) {
 
   if (Record->isAbstract())
     (void)AbstractClassUsageDiagnoser(*this, Record);
-
-  if (!Record->isDependentType() && !Record->isInvalidDecl())
-    AddImplicitlyDeclaredMembersToClass(Record);
 }
 
 void Sema::ActOnFinishCXXMemberSpecification(Scope* S, SourceLocation RLoc,
index 79e01a5833f177576d8066587290d7ded00bc52c..0ae6c446f3da9cbee74abac0470e02ac5d698e4a 100644 (file)
@@ -155,3 +155,17 @@ namespace PR5550 {
   }; 
   C x;
 }
+
+namespace PureImplicit {
+  // A pure virtual destructor should be implicitly overridden.
+  struct A { virtual ~A() = 0; };
+  struct B : A {};
+  B x;
+
+  // A pure virtual assignment operator should be implicitly overridden.
+  struct D;
+  struct C { virtual D& operator=(const D&) = 0; };
+  struct D : C {};
+  D y;
+}
+