diff options
author | Jordan Rose <jordan_rose@apple.com> | 2013-09-03 17:00:57 +0000 |
---|---|---|
committer | Jordan Rose <jordan_rose@apple.com> | 2013-09-03 17:00:57 +0000 |
commit | d2f4079db995c9dce34db0347b16df8ace62cf37 (patch) | |
tree | 87711f6c80a2132f91dc03f3c3a6b68328617f5e /clang/test/Analysis/cfg.cpp | |
parent | c74c4976499b6ae5ff758cf5189b7bd69ca1ddc3 (diff) | |
download | bcm5719-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.cpp | 46 |
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; +} |