summaryrefslogtreecommitdiffstats
path: root/clang/lib/Analysis
diff options
context:
space:
mode:
authorMarcin Swiderski <marcin.sfider@gmail.com>2010-10-25 07:05:54 +0000
committerMarcin Swiderski <marcin.sfider@gmail.com>2010-10-25 07:05:54 +0000
commit01769904d3ddeb9ffb238a8387663b286624214c (patch)
tree735c5a15ebc5997faa4455f4455aea51a91dc5c8 /clang/lib/Analysis
parent52e4bc1fede9b96bf6caec8fe6138e675ea14146 (diff)
downloadbcm5719-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.cpp17
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";
}
}
OpenPOWER on IntegriCloud