Perform access control even for the implicit destructor calls from implicit
destructor definitions. Remove some code duplication.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@98611 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp
index 1361318..1b3612d 100644
--- a/lib/Sema/SemaDeclCXX.cpp
+++ b/lib/Sema/SemaDeclCXX.cpp
@@ -3819,45 +3819,8 @@
DeclContext *PreviousContext = CurContext;
CurContext = Destructor;
- // C++ [class.dtor] p5
- // Before the implicitly-declared default destructor for a class is
- // implicitly defined, all the implicitly-declared default destructors
- // for its base class and its non-static data members shall have been
- // implicitly defined.
- for (CXXRecordDecl::base_class_iterator Base = ClassDecl->bases_begin(),
- E = ClassDecl->bases_end(); Base != E; ++Base) {
- CXXRecordDecl *BaseClassDecl
- = cast<CXXRecordDecl>(Base->getType()->getAs<RecordType>()->getDecl());
- if (!BaseClassDecl->hasTrivialDestructor()) {
- if (CXXDestructorDecl *BaseDtor =
- const_cast<CXXDestructorDecl*>(BaseClassDecl->getDestructor(Context)))
- MarkDeclarationReferenced(CurrentLocation, BaseDtor);
- else
- assert(false &&
- "DefineImplicitDestructor - missing dtor in a base class");
- }
- }
+ MarkBaseAndMemberDestructorsReferenced(Destructor);
- for (CXXRecordDecl::field_iterator Field = ClassDecl->field_begin(),
- E = ClassDecl->field_end(); Field != E; ++Field) {
- QualType FieldType = Context.getCanonicalType((*Field)->getType());
- if (const ArrayType *Array = Context.getAsArrayType(FieldType))
- FieldType = Array->getElementType();
- if (const RecordType *FieldClassType = FieldType->getAs<RecordType>()) {
- CXXRecordDecl *FieldClassDecl
- = cast<CXXRecordDecl>(FieldClassType->getDecl());
- if (!FieldClassDecl->hasTrivialDestructor()) {
- if (CXXDestructorDecl *FieldDtor =
- const_cast<CXXDestructorDecl*>(
- FieldClassDecl->getDestructor(Context)))
- MarkDeclarationReferenced(CurrentLocation, FieldDtor);
- else
- assert(false &&
- "DefineImplicitDestructor - missing dtor in class of a data member");
- }
- }
- }
-
// FIXME: If CheckDestructor fails, we should emit a note about where the
// implicit destructor was needed.
if (CheckDestructor(Destructor)) {