diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2009-07-15 22:34:08 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2009-07-15 22:34:08 +0000 |
commit | 560de45ccbf21c5e4dbeef3fc49f932e499cc181 (patch) | |
tree | f9d477eeec5d7b350031c47efa84bea707e325d5 /lib/AST/DeclCXX.cpp | |
parent | fde2efe96e00c5d03e7caaf0c1e67d7b011d9d0c (diff) |
Added ASTs to destructor decl AST for default destruction of object's
base/members.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@75849 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/AST/DeclCXX.cpp')
-rw-r--r-- | lib/AST/DeclCXX.cpp | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/lib/AST/DeclCXX.cpp b/lib/AST/DeclCXX.cpp index 674e98a265..57ac611b2c 100644 --- a/lib/AST/DeclCXX.cpp +++ b/lib/AST/DeclCXX.cpp @@ -478,6 +478,50 @@ CXXDestructorDecl::Create(ASTContext &C, CXXRecordDecl *RD, } void +CXXDestructorDecl::setBaseOrMemberDestructions(ASTContext &C) { + CXXRecordDecl *ClassDecl = cast<CXXRecordDecl>(getDeclContext()); + llvm::SmallVector<CXXBaseOrMemberInitializer*, 32> AllToDestruct; + for (CXXRecordDecl::base_class_iterator VBase = ClassDecl->vbases_begin(), + E = ClassDecl->vbases_end(); VBase != E; ++VBase) { + CXXBaseOrMemberInitializer *Member = + new CXXBaseOrMemberInitializer(VBase->getType(), 0, 0,SourceLocation()); + AllToDestruct.push_back(Member); + } + for (CXXRecordDecl::base_class_iterator Base = + ClassDecl->bases_begin(), + E = ClassDecl->bases_end(); Base != E; ++Base) { + if (Base->isVirtual()) + continue; + CXXBaseOrMemberInitializer *Member = + new CXXBaseOrMemberInitializer(Base->getType(), 0, 0, SourceLocation()); + AllToDestruct.push_back(Member); + } + // non-static data members. + for (CXXRecordDecl::field_iterator Field = ClassDecl->field_begin(), + E = ClassDecl->field_end(); Field != E; ++Field) { + QualType FieldType = C.getCanonicalType((*Field)->getType()); + while (const ArrayType *AT = C.getAsArrayType(FieldType)) + FieldType = AT->getElementType(); + + if (FieldType->getAsRecordType()) { + CXXBaseOrMemberInitializer *Member = + new CXXBaseOrMemberInitializer((*Field), 0, 0, SourceLocation()); + AllToDestruct.push_back(Member); + } + } + + unsigned NumDestructions = AllToDestruct.size(); + if (NumDestructions > 0) { + NumBaseOrMemberDestructions = NumDestructions; + BaseOrMemberDestructions = + new (C) CXXBaseOrMemberInitializer*[NumDestructions]; + // Insert in reverse order. + for (int Idx = NumDestructions-1, i=0 ; Idx >= 0; --Idx) + BaseOrMemberDestructions[i++] = AllToDestruct[Idx]; + } +} + +void CXXConstructorDecl::setBaseOrMemberInitializers( ASTContext &C, CXXBaseOrMemberInitializer **Initializers, |