diff options
author | Marcin Swiderski <marcin.sfider@gmail.com> | 2010-10-25 07:05:54 +0000 |
---|---|---|
committer | Marcin Swiderski <marcin.sfider@gmail.com> | 2010-10-25 07:05:54 +0000 |
commit | 01769904d3ddeb9ffb238a8387663b286624214c (patch) | |
tree | 735c5a15ebc5997faa4455f4455aea51a91dc5c8 /clang/lib/Analysis | |
parent | 52e4bc1fede9b96bf6caec8fe6138e675ea14146 (diff) | |
download | bcm5719-llvm-01769904d3ddeb9ffb238a8387663b286624214c.tar.gz bcm5719-llvm-01769904d3ddeb9ffb238a8387663b286624214c.zip |
Added generation of destructors for member constant size arrays.
There's only one destructor call generated for each not empty array (at least for now this should be enough).
llvm-svn: 117252
Diffstat (limited to 'clang/lib/Analysis')
-rw-r--r-- | clang/lib/Analysis/CFG.cpp | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/clang/lib/Analysis/CFG.cpp b/clang/lib/Analysis/CFG.cpp index 1026035b3bb..f003879b7a7 100644 --- a/clang/lib/Analysis/CFG.cpp +++ b/clang/lib/Analysis/CFG.cpp @@ -552,7 +552,15 @@ void CFGBuilder::addImplicitDtorsForDestructor(const CXXDestructorDecl *DD) { // First destroy member objects. for (CXXRecordDecl::field_iterator FI = RD->field_begin(), FE = RD->field_end(); FI != FE; ++FI) { - if (const CXXRecordDecl *CD = FI->getType()->getAsCXXRecordDecl()) + // Check for constant size array. Set type to array element type. + QualType QT = FI->getType(); + if (const ConstantArrayType *AT = Context->getAsConstantArrayType(QT)) { + if (AT->getSize() == 0) + continue; + QT = AT->getElementType(); + } + + if (const CXXRecordDecl *CD = QT->getAsCXXRecordDecl()) if (!CD->hasTrivialDestructor()) { autoCreateBlock(); appendMemberDtor(Block, *FI); @@ -2729,8 +2737,13 @@ static void print_elem(llvm::raw_ostream &OS, StmtPrinterHelper* Helper, } else if (CFGMemberDtor ME = E.getAs<CFGMemberDtor>()) { FieldDecl *FD = ME.getFieldDecl(); + + const Type *T = FD->getType().getTypePtr(); + if (const Type *ET = T->getArrayElementTypeNoTypeQual()) + T = ET; + OS << "this->" << FD->getName(); - OS << ".~" << FD->getType()->getAsCXXRecordDecl()->getName() << "()"; + OS << ".~" << T->getAsCXXRecordDecl()->getName() << "()"; OS << " (Member object destructor)\n"; } } |