aboutsummaryrefslogtreecommitdiff
path: root/lib/Analysis/CFG.cpp
diff options
context:
space:
mode:
authorMarcin Swiderski <marcin.sfider@gmail.com>2010-10-25 07:00:40 +0000
committerMarcin Swiderski <marcin.sfider@gmail.com>2010-10-25 07:00:40 +0000
commitb1c52870b8c2feaa7cd112295368bec53af490a0 (patch)
tree16942985af3dfe29f3c37f7b08ccef3bd76b3a39 /lib/Analysis/CFG.cpp
parent4846675e0e42d1802b0ffd8972a45e72aeb3758d (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.cpp12
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";