diff options
author | Marcin Swiderski <marcin.sfider@gmail.com> | 2010-10-25 07:00:40 +0000 |
---|---|---|
committer | Marcin Swiderski <marcin.sfider@gmail.com> | 2010-10-25 07:00:40 +0000 |
commit | b1c52870b8c2feaa7cd112295368bec53af490a0 (patch) | |
tree | 16942985af3dfe29f3c37f7b08ccef3bd76b3a39 /lib/Analysis/CFG.cpp | |
parent | 4846675e0e42d1802b0ffd8972a45e72aeb3758d (diff) |
Added generation of destructors for constant size arrays.
There's only one destructor call generated for each not empty array (at least for now this should be enough).
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@117251 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/CFG.cpp')
-rw-r--r-- | lib/Analysis/CFG.cpp | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/lib/Analysis/CFG.cpp b/lib/Analysis/CFG.cpp index 6f7be9a252..1026035b3b 100644 --- a/lib/Analysis/CFG.cpp +++ b/lib/Analysis/CFG.cpp @@ -641,8 +641,14 @@ LocalScope* CFGBuilder::addLocalScopeForVarDecl(VarDecl* VD, return Scope; } - // Check if type is a C++ class with non-trivial destructor. + // Check for constant size array. Set type to array element type. + if (const ConstantArrayType *AT = Context->getAsConstantArrayType(QT)) { + if (AT->getSize() == 0) + return Scope; + QT = AT->getElementType(); + } + // Check if type is a C++ class with non-trivial destructor. if (const CXXRecordDecl* CD = QT->getAsCXXRecordDecl()) if (!CD->hasTrivialDestructor()) { // Add the variable to scope @@ -2707,9 +2713,11 @@ static void print_elem(llvm::raw_ostream &OS, StmtPrinterHelper* Helper, VarDecl* VD = DE.getVarDecl(); Helper->handleDecl(VD, OS); - Type* T = VD->getType().getTypePtr(); + const Type* T = VD->getType().getTypePtr(); if (const ReferenceType* RT = T->getAs<ReferenceType>()) T = RT->getPointeeType().getTypePtr(); + else if (const Type *ET = T->getArrayElementTypeNoTypeQual()) + T = ET; OS << ".~" << T->getAsCXXRecordDecl()->getName().str() << "()"; OS << " (Implicit destructor)\n"; |