aboutsummaryrefslogtreecommitdiff
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
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
-rw-r--r--lib/Analysis/CFG.cpp12
-rw-r--r--test/Analysis/auto-obj-dtors-cfg-output.cpp17
2 files changed, 27 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";
diff --git a/test/Analysis/auto-obj-dtors-cfg-output.cpp b/test/Analysis/auto-obj-dtors-cfg-output.cpp
index 8a6c55b60b..129a0c2616 100644
--- a/test/Analysis/auto-obj-dtors-cfg-output.cpp
+++ b/test/Analysis/auto-obj-dtors-cfg-output.cpp
@@ -16,6 +16,11 @@ void test_const_ref() {
const A& c = A();
}
+void test_array() {
+ A a[2];
+ A b[0];
+}
+
void test_scope() {
A a;
{ A c;
@@ -165,6 +170,18 @@ void test_catch_copy() {
// CHECK: Predecessors (1): B1
// CHECK: Successors (0):
// CHECK: [ B2 (ENTRY) ]
+// CHECK: Predecessors (0):
+// CHECK: Successors (1): B1
+// CHECK: [ B1 ]
+// CHECK: 1: A a[2];
+// CHECK: 2: A b[0];
+// CHECK: 3: [B1.1].~A() (Implicit destructor)
+// CHECK: Predecessors (1): B2
+// CHECK: Successors (1): B0
+// CHECK: [ B0 (EXIT) ]
+// CHECK: Predecessors (1): B1
+// CHECK: Successors (0):
+// CHECK: [ B2 (ENTRY) ]
// CHECK: Predecessors (0):
// CHECK: Successors (1): B1
// CHECK: [ B1 ]