From 0ed2e0823cc7b727abd9307db4cd887f293eebe2 Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Mon, 27 Sep 2010 22:48:58 +0000 Subject: [PATCH] Centralize the handling of CXXRecordDecl::DefinitionData's DeclaredDestructor and UserDeclaredDestructor bits in CXXRecordDecl itself. Another step on the road to . git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@114918 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/AST/DeclCXX.h | 14 -------------- lib/AST/DeclCXX.cpp | 14 ++++++++++---- lib/Sema/SemaDecl.cpp | 1 - lib/Sema/SemaDeclCXX.cpp | 1 - 4 files changed, 10 insertions(+), 20 deletions(-) diff --git a/include/clang/AST/DeclCXX.h b/include/clang/AST/DeclCXX.h index be5ec06471..975659b1e5 100644 --- a/include/clang/AST/DeclCXX.h +++ b/include/clang/AST/DeclCXX.h @@ -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() { diff --git a/lib/AST/DeclCXX.cpp b/lib/AST/DeclCXX.cpp index bf1e58c7c9..5d9a09da70 100644 --- a/lib/AST/DeclCXX.cpp +++ b/lib/AST/DeclCXX.cpp @@ -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(D)) { + } else if (isa(D)) { + data().DeclaredDestructor = true; + } else if (CXXMethodDecl *Method = dyn_cast(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(D)) { + data().DeclaredDestructor = true; + data().UserDeclaredDestructor = true; + return; + } + // Handle (user-declared) member functions. if (CXXMethodDecl *Method = dyn_cast(D)) { if (Method->getOverloadedOperator() == OO_Equal) { // We're interested specifically in copy assignment operators. diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index d5d0148594..68cdc556e8 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -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); diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp index b540f8d43b..473247139e 100644 --- a/lib/Sema/SemaDeclCXX.cpp +++ b/lib/Sema/SemaDeclCXX.cpp @@ -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. -- 2.40.0