]> granicus.if.org Git - clang/commitdiff
Centralize the handling of CXXRecordDecl::DefinitionData's
authorDouglas Gregor <dgregor@apple.com>
Mon, 27 Sep 2010 22:48:58 +0000 (22:48 +0000)
committerDouglas Gregor <dgregor@apple.com>
Mon, 27 Sep 2010 22:48:58 +0000 (22:48 +0000)
DeclaredDestructor and UserDeclaredDestructor bits in CXXRecordDecl
itself. Another step on the road to <rdar://problem/8459981>.

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

include/clang/AST/DeclCXX.h
lib/AST/DeclCXX.cpp
lib/Sema/SemaDecl.cpp
lib/Sema/SemaDeclCXX.cpp

index be5ec0647128ac8c31aea46d9651a9046241972b..975659b1e50e93a83aba4583cb53c2677124a83a 100644 (file)
@@ -631,26 +631,12 @@ public:
     return data().UserDeclaredDestructor;
   }
 
-  /// setUserDeclaredDestructor - Set whether this class has a
-  /// user-declared destructor. If not set by the time the class is
-  /// fully defined, a destructor will be implicitly declared.
-  void setUserDeclaredDestructor(bool UCD) {
-    data().UserDeclaredDestructor = UCD;
-    if (UCD)
-      data().DeclaredDestructor = true;
-  }
-
   /// \brief Determine whether this class has had its destructor declared,
   /// either via the user or via an implicit declaration.
   ///
   /// This value is used for lazy creation of destructors.
   bool hasDeclaredDestructor() const { return data().DeclaredDestructor; }
   
-  /// \brief Note whether this class has already had its destructor declared.
-  void setDeclaredDestructor(bool DD) {
-    data().DeclaredDestructor = DD;
-  }
-  
   /// getConversions - Retrieve the overload set containing all of the
   /// conversion functions in this class.
   UnresolvedSetImpl *getConversionFunctions() {
index bf1e58c7c964642b28c38593b02a1b142757746d..5d9a09da702083fc779082c57417b3ab6da3aa23 100644 (file)
@@ -278,9 +278,9 @@ CXXRecordDecl::addedMember(Decl *D) {
       // declared it.
       else if (Constructor->isCopyConstructor())
         data().DeclaredCopyConstructor = true;
-    }
-    // FIXME: Destructors
-    else if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(D)) {
+    } else if (isa<CXXDestructorDecl>(D)) {
+      data().DeclaredDestructor = true;
+    else if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(D)) {
       // If this is the implicit copy constructor, note that we have now
       // declared it.
       // FIXME: Move constructors
@@ -330,8 +330,14 @@ CXXRecordDecl::addedMember(Decl *D) {
     return;
   }
 
-  // FIXME: Destructors.
+  // Handle (user-declared) destructors.
+  if (isa<CXXDestructorDecl>(D)) {
+    data().DeclaredDestructor = true;
+    data().UserDeclaredDestructor = true;
+    return;
+  }
   
+  // Handle (user-declared) member functions.
   if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(D)) {
     if (Method->getOverloadedOperator() == OO_Equal) {
       // We're interested specifically in copy assignment operators.
index d5d01485941c9c8695ebc97176ab23a07ca8a24d..68cdc556e8d56c0a1ad9da8a096be8fc3b62ae8c 100644 (file)
@@ -3931,7 +3931,6 @@ void Sema::CheckFunctionDeclaration(Scope *S, FunctionDecl *NewFD,
         }
       }
 
-      Record->setUserDeclaredDestructor(true);
       // C++ [class]p4: A POD-struct is an aggregate class that has [...] no
       // user-defined destructor.
       Record->setPOD(false);
index b540f8d43bd8101887973c18c2940edfc2f7a876..473247139e65463db494eb9a0fdeb0b55e142bb4 100644 (file)
@@ -4534,7 +4534,6 @@ CXXDestructorDecl *Sema::DeclareImplicitDestructor(CXXRecordDecl *ClassDecl) {
   Destructor->setTrivial(ClassDecl->hasTrivialDestructor());
   
   // Note that we have declared this destructor.
-  ClassDecl->setDeclaredDestructor(true);
   ++ASTContext::NumImplicitDestructorsDeclared;
   
   // Introduce this destructor into its scope.