summaryrefslogtreecommitdiffstats
path: root/clang/test/Analysis/cfg.cpp
diff options
context:
space:
mode:
authorJordan Rose <jordan_rose@apple.com>2013-09-03 17:00:57 +0000
committerJordan Rose <jordan_rose@apple.com>2013-09-03 17:00:57 +0000
commitd2f4079db995c9dce34db0347b16df8ace62cf37 (patch)
tree87711f6c80a2132f91dc03f3c3a6b68328617f5e /clang/test/Analysis/cfg.cpp
parentc74c4976499b6ae5ff758cf5189b7bd69ca1ddc3 (diff)
downloadbcm5719-llvm-d2f4079db995c9dce34db0347b16df8ace62cf37.tar.gz
bcm5719-llvm-d2f4079db995c9dce34db0347b16df8ace62cf37.zip
Add an implicit dtor CFG node just before C++ 'delete' expressions.
This paves the way for adding support for modeling the destructor of a region before it is deleted. The statement "delete <expr>" now generates this series of CFG elements: 1. <expr> 2. [B1.1]->~Foo() (Implicit destructor) 3. delete [B1.1] Patch by Karthik Bhat! llvm-svn: 189828
Diffstat (limited to 'clang/test/Analysis/cfg.cpp')
-rw-r--r--clang/test/Analysis/cfg.cpp46
1 files changed, 46 insertions, 0 deletions
diff --git a/clang/test/Analysis/cfg.cpp b/clang/test/Analysis/cfg.cpp
index 779e7901029..243e1aed99c 100644
--- a/clang/test/Analysis/cfg.cpp
+++ b/clang/test/Analysis/cfg.cpp
@@ -98,3 +98,49 @@ void testBuiltinSize() {
extern int *dummy();
(void)__builtin_object_size(dummy(), 0);
}
+
+
+class A {
+public:
+ A() {}
+ ~A() {}
+};
+
+// CHECK: [B2 (ENTRY)]
+// CHECK-NEXT: Succs (1): B1
+// CHECK: [B1]
+// CHECK-NEXT: 1: (CXXConstructExpr, class A)
+// CHECK-NEXT: 2: new A([B1.1])
+// CHECK-NEXT: 3: A *a = new A();
+// CHECK-NEXT: 4: a
+// CHECK-NEXT: 5: [B1.4] (ImplicitCastExpr, LValueToRValue, class A *)
+// CHECK-NEXT: 6: [B1.5]->~A() (Implicit destructor)
+// CHECK-NEXT: 7: delete [B1.5]
+// CHECK-NEXT: Preds (1): B2
+// CHECK-NEXT: Succs (1): B0
+// CHECK: [B0 (EXIT)]
+// CHECK-NEXT: Preds (1): B1
+void test_deletedtor() {
+ A *a = new A();
+ delete a;
+}
+
+// CHECK: [B2 (ENTRY)]
+// CHECK-NEXT: Succs (1): B1
+// CHECK: [B1]
+// CHECK-NEXT: 1: 5
+// CHECK-NEXT: 2: (CXXConstructExpr, class A)
+// CHECK-NEXT: 3: new A {{\[\[}}B1.1]]
+// CHECK-NEXT: 4: A *a = new A [5];
+// CHECK-NEXT: 5: a
+// CHECK-NEXT: 6: [B1.5] (ImplicitCastExpr, LValueToRValue, class A *)
+// CHECK-NEXT: 7: [B1.6]->~A() (Implicit destructor)
+// CHECK-NEXT: 8: delete [] [B1.6]
+// CHECK-NEXT: Preds (1): B2
+// CHECK-NEXT: Succs (1): B0
+// CHECK: [B0 (EXIT)]
+// CHECK-NEXT: Preds (1): B1
+void test_deleteArraydtor() {
+ A *a = new A[5];
+ delete[] a;
+}
OpenPOWER on IntegriCloud