summaryrefslogtreecommitdiffstats
path: root/clang/test/Analysis
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2012-07-14 05:04:10 +0000
committerTed Kremenek <kremenek@apple.com>2012-07-14 05:04:10 +0000
commitb50e716bac45a9713144869b01c2850ef8048100 (patch)
tree0277aa2738596438d54cbe59b51d56264031ae5f /clang/test/Analysis
parenta16436f51e83ba5b55540b96c266c3c6265381cf (diff)
downloadbcm5719-llvm-b50e716bac45a9713144869b01c2850ef8048100.tar.gz
bcm5719-llvm-b50e716bac45a9713144869b01c2850ef8048100.zip
Refine CFG so that '&&' and '||' don't lead to extra confluence points when used in a branch, but
instead push the terminator for the branch down into the basic blocks of the subexpressions of '&&' and '||' respectively. This eliminates some artifical control-flow from the CFG and results in a more compact CFG. Note that this patch only alters the branches 'while', 'if' and 'for'. This was complex enough for one patch. The remaining branches (e.g., do...while) can be handled in a separate patch, but they weren't immediately tackled because they were less important. It is possible that this patch introduces some subtle bugs, particularly w.r.t. to destructor placement. I've tried to audit these changes, but it is also known that the destructor logic needs some refinement in the area of '||' and '&&' regardless (i.e., their are known bugs). llvm-svn: 160218
Diffstat (limited to 'clang/test/Analysis')
-rw-r--r--clang/test/Analysis/auto-obj-dtors-cfg-output.cpp295
-rw-r--r--clang/test/Analysis/domtest.c45
-rw-r--r--clang/test/Analysis/temp-obj-dtors-cfg-output.cpp205
3 files changed, 315 insertions, 230 deletions
diff --git a/clang/test/Analysis/auto-obj-dtors-cfg-output.cpp b/clang/test/Analysis/auto-obj-dtors-cfg-output.cpp
index 67a8f2e555b..566e6caed60 100644
--- a/clang/test/Analysis/auto-obj-dtors-cfg-output.cpp
+++ b/clang/test/Analysis/auto-obj-dtors-cfg-output.cpp
@@ -416,121 +416,121 @@ void test_catch_copy() {
// CHECK: [B6 (ENTRY)]
// CHECK: Succs (1): B5
// CHECK: [B1]
-// CHECK: 1: [B2.4].~A() (Implicit destructor)
+// CHECK: 1: [B4.4].~A() (Implicit destructor)
// CHECK: 2: [B5.2].~A() (Implicit destructor)
-// CHECK: Preds (1): B2
+// CHECK: Preds (1): B4
// CHECK: Succs (1): B0
// CHECK: [B2]
-// CHECK: 1: a
-// CHECK: 2: [B2.1] (ImplicitCastExpr, NoOp, const class A)
-// CHECK: 3: [B2.2] (CXXConstructExpr, class A)
-// CHECK: 4: A b = a;
-// CHECK: 5: b
-// CHECK: 6: [B2.5] (ImplicitCastExpr, NoOp, const class A)
-// CHECK: 7: [B2.6].operator int
-// CHECK: 8: [B2.7]()
-// CHECK: 9: [B2.8] (ImplicitCastExpr, UserDefinedConversion, int)
-// CHECK: 10: [B2.9] (ImplicitCastExpr, IntegralToBoolean, _Bool)
-// CHECK: T: while [B2.10]
-// CHECK: Preds (2): B3 B5
-// CHECK: Succs (2): B4 B1
+// CHECK: Preds (1): B3
+// CHECK: Succs (1): B4
// CHECK: [B3]
+// CHECK: 1: (CXXConstructExpr, class A)
+// CHECK: 2: A c;
+// CHECK: 3: [B3.2].~A() (Implicit destructor)
+// CHECK: 4: [B4.4].~A() (Implicit destructor)
// CHECK: Preds (1): B4
// CHECK: Succs (1): B2
// CHECK: [B4]
-// CHECK: 1: (CXXConstructExpr, class A)
-// CHECK: 2: A c;
-// CHECK: 3: [B4.2].~A() (Implicit destructor)
-// CHECK: 4: [B2.4].~A() (Implicit destructor)
-// CHECK: Preds (1): B2
-// CHECK: Succs (1): B3
+// CHECK: 1: a
+// CHECK: 2: [B4.1] (ImplicitCastExpr, NoOp, const class A)
+// CHECK: 3: [B4.2] (CXXConstructExpr, class A)
+// CHECK: 4: A b = a;
+// CHECK: 5: b
+// CHECK: 6: [B4.5] (ImplicitCastExpr, NoOp, const class A)
+// CHECK: 7: [B4.6].operator int
+// CHECK: 8: [B4.7]()
+// CHECK: 9: [B4.8] (ImplicitCastExpr, UserDefinedConversion, int)
+// CHECK: 10: [B4.9] (ImplicitCastExpr, IntegralToBoolean, _Bool)
+// CHECK: T: while [B4.10]
+// CHECK: Preds (2): B2 B5
+// CHECK: Succs (2): B3 B1
// CHECK: [B5]
// CHECK: 1: (CXXConstructExpr, class A)
// CHECK: 2: A a;
// CHECK: Preds (1): B6
-// CHECK: Succs (1): B2
+// CHECK: Succs (1): B4
// CHECK: [B0 (EXIT)]
// CHECK: Preds (1): B1
// CHECK: [B12 (ENTRY)]
// CHECK: Succs (1): B11
// CHECK: [B1]
-// CHECK: 1: [B2.4].~A() (Implicit destructor)
+// CHECK: 1: [B10.4].~A() (Implicit destructor)
// CHECK: 2: (CXXConstructExpr, class A)
// CHECK: 3: A e;
// CHECK: 4: [B1.3].~A() (Implicit destructor)
// CHECK: 5: [B11.2].~A() (Implicit destructor)
-// CHECK: Preds (2): B9 B2
+// CHECK: Preds (2): B8 B10
// CHECK: Succs (1): B0
// CHECK: [B2]
-// CHECK: 1: a
-// CHECK: 2: [B2.1] (ImplicitCastExpr, NoOp, const class A)
-// CHECK: 3: [B2.2] (CXXConstructExpr, class A)
-// CHECK: 4: A b = a;
-// CHECK: 5: b
-// CHECK: 6: [B2.5] (ImplicitCastExpr, NoOp, const class A)
-// CHECK: 7: [B2.6].operator int
-// CHECK: 8: [B2.7]()
-// CHECK: 9: [B2.8] (ImplicitCastExpr, UserDefinedConversion, int)
-// CHECK: 10: [B2.9] (ImplicitCastExpr, IntegralToBoolean, _Bool)
-// CHECK: T: while [B2.10]
-// CHECK: Preds (2): B3 B11
-// CHECK: Succs (2): B10 B1
+// CHECK: Preds (2): B3 B6
+// CHECK: Succs (1): B10
// CHECK: [B3]
-// CHECK: Preds (2): B4 B7
-// CHECK: Succs (1): B2
-// CHECK: [B4]
// CHECK: 1: (CXXConstructExpr, class A)
// CHECK: 2: A d;
-// CHECK: 3: [B4.2].~A() (Implicit destructor)
-// CHECK: 4: [B10.2].~A() (Implicit destructor)
-// CHECK: 5: [B2.4].~A() (Implicit destructor)
-// CHECK: Preds (1): B6
-// CHECK: Succs (1): B3
-// CHECK: [B5]
+// CHECK: 3: [B3.2].~A() (Implicit destructor)
+// CHECK: 4: [B9.2].~A() (Implicit destructor)
+// CHECK: 5: [B10.4].~A() (Implicit destructor)
+// CHECK: Preds (1): B5
+// CHECK: Succs (1): B2
+// CHECK: [B4]
// CHECK: 1: return;
-// CHECK: 2: [B10.2].~A() (Implicit destructor)
-// CHECK: 3: [B2.4].~A() (Implicit destructor)
+// CHECK: 2: [B9.2].~A() (Implicit destructor)
+// CHECK: 3: [B10.4].~A() (Implicit destructor)
// CHECK: 4: [B11.2].~A() (Implicit destructor)
-// CHECK: Preds (1): B6
+// CHECK: Preds (1): B5
// CHECK: Succs (1): B0
-// CHECK: [B6]
+// CHECK: [B5]
// CHECK: 1: UV
-// CHECK: 2: [B6.1] (ImplicitCastExpr, LValueToRValue, _Bool)
-// CHECK: T: if [B6.2]
-// CHECK: Preds (1): B8
-// CHECK: Succs (2): B5 B4
-// CHECK: [B7]
-// CHECK: 1: [B10.2].~A() (Implicit destructor)
-// CHECK: 2: [B2.4].~A() (Implicit destructor)
+// CHECK: 2: [B5.1] (ImplicitCastExpr, LValueToRValue, _Bool)
+// CHECK: T: if [B5.2]
+// CHECK: Preds (1): B7
+// CHECK: Succs (2): B4 B3
+// CHECK: [B6]
+// CHECK: 1: [B9.2].~A() (Implicit destructor)
+// CHECK: 2: [B10.4].~A() (Implicit destructor)
// CHECK: T: continue;
-// CHECK: Preds (1): B8
-// CHECK: Succs (1): B3
-// CHECK: [B8]
+// CHECK: Preds (1): B7
+// CHECK: Succs (1): B2
+// CHECK: [B7]
// CHECK: 1: UV
-// CHECK: 2: [B8.1] (ImplicitCastExpr, LValueToRValue, _Bool)
-// CHECK: T: if [B8.2]
-// CHECK: Preds (1): B10
-// CHECK: Succs (2): B7 B6
-// CHECK: [B9]
-// CHECK: 1: [B10.2].~A() (Implicit destructor)
+// CHECK: 2: [B7.1] (ImplicitCastExpr, LValueToRValue, _Bool)
+// CHECK: T: if [B7.2]
+// CHECK: Preds (1): B9
+// CHECK: Succs (2): B6 B5
+// CHECK: [B8]
+// CHECK: 1: [B9.2].~A() (Implicit destructor)
// CHECK: T: break;
-// CHECK: Preds (1): B10
+// CHECK: Preds (1): B9
// CHECK: Succs (1): B1
-// CHECK: [B10]
+// CHECK: [B9]
// CHECK: 1: (CXXConstructExpr, class A)
// CHECK: 2: A c;
// CHECK: 3: UV
-// CHECK: 4: [B10.3] (ImplicitCastExpr, LValueToRValue, _Bool)
-// CHECK: T: if [B10.4]
-// CHECK: Preds (1): B2
-// CHECK: Succs (2): B9 B8
+// CHECK: 4: [B9.3] (ImplicitCastExpr, LValueToRValue, _Bool)
+// CHECK: T: if [B9.4]
+// CHECK: Preds (1): B10
+// CHECK: Succs (2): B8 B7
+// CHECK: [B10]
+// CHECK: 1: a
+// CHECK: 2: [B10.1] (ImplicitCastExpr, NoOp, const class A)
+// CHECK: 3: [B10.2] (CXXConstructExpr, class A)
+// CHECK: 4: A b = a;
+// CHECK: 5: b
+// CHECK: 6: [B10.5] (ImplicitCastExpr, NoOp, const class A)
+// CHECK: 7: [B10.6].operator int
+// CHECK: 8: [B10.7]()
+// CHECK: 9: [B10.8] (ImplicitCastExpr, UserDefinedConversion, int)
+// CHECK: 10: [B10.9] (ImplicitCastExpr, IntegralToBoolean, _Bool)
+// CHECK: T: while [B10.10]
+// CHECK: Preds (2): B2 B11
+// CHECK: Succs (2): B9 B1
// CHECK: [B11]
// CHECK: 1: (CXXConstructExpr, class A)
// CHECK: 2: A a;
// CHECK: Preds (1): B12
-// CHECK: Succs (1): B2
+// CHECK: Succs (1): B10
// CHECK: [B0 (EXIT)]
-// CHECK: Preds (2): B1 B5
+// CHECK: Preds (2): B1 B4
// CHECK: [B4 (ENTRY)]
// CHECK: Succs (1): B2
// CHECK: [B1]
@@ -717,124 +717,124 @@ void test_catch_copy() {
// CHECK: [B6 (ENTRY)]
// CHECK: Succs (1): B5
// CHECK: [B1]
-// CHECK: 1: [B2.4].~A() (Implicit destructor)
+// CHECK: 1: [B4.4].~A() (Implicit destructor)
// CHECK: 2: [B5.2].~A() (Implicit destructor)
-// CHECK: Preds (1): B2
+// CHECK: Preds (1): B4
// CHECK: Succs (1): B0
// CHECK: [B2]
-// CHECK: 1: a
-// CHECK: 2: [B2.1] (ImplicitCastExpr, NoOp, const class A)
-// CHECK: 3: [B2.2] (CXXConstructExpr, class A)
-// CHECK: 4: A b = a;
-// CHECK: 5: b
-// CHECK: 6: [B2.5] (ImplicitCastExpr, NoOp, const class A)
-// CHECK: 7: [B2.6].operator int
-// CHECK: 8: [B2.7]()
-// CHECK: 9: [B2.8] (ImplicitCastExpr, UserDefinedConversion, int)
-// CHECK: 10: [B2.9] (ImplicitCastExpr, IntegralToBoolean, _Bool)
-// CHECK: T: for (...; [B2.10]; )
-// CHECK: Preds (2): B3 B5
-// CHECK: Succs (2): B4 B1
+// CHECK: Preds (1): B3
+// CHECK: Succs (1): B4
// CHECK: [B3]
-// CHECK: 1: [B2.4].~A() (Implicit destructor)
+// CHECK: 1: (CXXConstructExpr, class A)
+// CHECK: 2: A c;
+// CHECK: 3: [B3.2].~A() (Implicit destructor)
+// CHECK: 4: [B4.4].~A() (Implicit destructor)
// CHECK: Preds (1): B4
// CHECK: Succs (1): B2
// CHECK: [B4]
-// CHECK: 1: (CXXConstructExpr, class A)
-// CHECK: 2: A c;
-// CHECK: 3: [B4.2].~A() (Implicit destructor)
-// CHECK: Preds (1): B2
-// CHECK: Succs (1): B3
+// CHECK: 1: a
+// CHECK: 2: [B4.1] (ImplicitCastExpr, NoOp, const class A)
+// CHECK: 3: [B4.2] (CXXConstructExpr, class A)
+// CHECK: 4: A b = a;
+// CHECK: 5: b
+// CHECK: 6: [B4.5] (ImplicitCastExpr, NoOp, const class A)
+// CHECK: 7: [B4.6].operator int
+// CHECK: 8: [B4.7]()
+// CHECK: 9: [B4.8] (ImplicitCastExpr, UserDefinedConversion, int)
+// CHECK: 10: [B4.9] (ImplicitCastExpr, IntegralToBoolean, _Bool)
+// CHECK: T: for (...; [B4.10]; )
+// CHECK: Preds (2): B2 B5
+// CHECK: Succs (2): B3 B1
// CHECK: [B5]
// CHECK: 1: (CXXConstructExpr, class A)
// CHECK: 2: A a;
// CHECK: Preds (1): B6
-// CHECK: Succs (1): B2
+// CHECK: Succs (1): B4
// CHECK: [B0 (EXIT)]
// CHECK: Preds (1): B1
// CHECK: [B12 (ENTRY)]
// CHECK: Succs (1): B11
// CHECK: [B1]
-// CHECK: 1: [B2.4].~A() (Implicit destructor)
+// CHECK: 1: [B10.4].~A() (Implicit destructor)
// CHECK: 2: [B11.4].~A() (Implicit destructor)
// CHECK: 3: (CXXConstructExpr, class A)
// CHECK: 4: A f;
// CHECK: 5: [B1.4].~A() (Implicit destructor)
// CHECK: 6: [B11.2].~A() (Implicit destructor)
-// CHECK: Preds (2): B9 B2
+// CHECK: Preds (2): B8 B10
// CHECK: Succs (1): B0
// CHECK: [B2]
-// CHECK: 1: b
-// CHECK: 2: [B2.1] (ImplicitCastExpr, NoOp, const class A)
-// CHECK: 3: [B2.2] (CXXConstructExpr, class A)
-// CHECK: 4: A c = b;
-// CHECK: 5: c
-// CHECK: 6: [B2.5] (ImplicitCastExpr, NoOp, const class A)
-// CHECK: 7: [B2.6].operator int
-// CHECK: 8: [B2.7]()
-// CHECK: 9: [B2.8] (ImplicitCastExpr, UserDefinedConversion, int)
-// CHECK: 10: [B2.9] (ImplicitCastExpr, IntegralToBoolean, _Bool)
-// CHECK: T: for (...; [B2.10]; )
-// CHECK: Preds (2): B3 B11
-// CHECK: Succs (2): B10 B1
+// CHECK: Preds (2): B3 B6
+// CHECK: Succs (1): B10
// CHECK: [B3]
-// CHECK: 1: [B2.4].~A() (Implicit destructor)
-// CHECK: Preds (2): B4 B7
-// CHECK: Succs (1): B2
-// CHECK: [B4]
// CHECK: 1: (CXXConstructExpr, class A)
// CHECK: 2: A e;
-// CHECK: 3: [B4.2].~A() (Implicit destructor)
-// CHECK: 4: [B10.2].~A() (Implicit destructor)
-// CHECK: Preds (1): B6
-// CHECK: Succs (1): B3
-// CHECK: [B5]
+// CHECK: 3: [B3.2].~A() (Implicit destructor)
+// CHECK: 4: [B9.2].~A() (Implicit destructor)
+// CHECK: 5: [B10.4].~A() (Implicit destructor)
+// CHECK: Preds (1): B5
+// CHECK: Succs (1): B2
+// CHECK: [B4]
// CHECK: 1: return;
-// CHECK: 2: [B10.2].~A() (Implicit destructor)
-// CHECK: 3: [B2.4].~A() (Implicit destructor)
+// CHECK: 2: [B9.2].~A() (Implicit destructor)
+// CHECK: 3: [B10.4].~A() (Implicit destructor)
// CHECK: 4: [B11.4].~A() (Implicit destructor)
// CHECK: 5: [B11.2].~A() (Implicit destructor)
-// CHECK: Preds (1): B6
+// CHECK: Preds (1): B5
// CHECK: Succs (1): B0
-// CHECK: [B6]
+// CHECK: [B5]
// CHECK: 1: UV
-// CHECK: 2: [B6.1] (ImplicitCastExpr, LValueToRValue, _Bool)
-// CHECK: T: if [B6.2]
-// CHECK: Preds (1): B8
-// CHECK: Succs (2): B5 B4
-// CHECK: [B7]
-// CHECK: 1: [B10.2].~A() (Implicit destructor)
+// CHECK: 2: [B5.1] (ImplicitCastExpr, LValueToRValue, _Bool)
+// CHECK: T: if [B5.2]
+// CHECK: Preds (1): B7
+// CHECK: Succs (2): B4 B3
+// CHECK: [B6]
+// CHECK: 1: [B9.2].~A() (Implicit destructor)
// CHECK: T: continue;
-// CHECK: Preds (1): B8
-// CHECK: Succs (1): B3
-// CHECK: [B8]
+// CHECK: Preds (1): B7
+// CHECK: Succs (1): B2
+// CHECK: [B7]
// CHECK: 1: UV
-// CHECK: 2: [B8.1] (ImplicitCastExpr, LValueToRValue, _Bool)
-// CHECK: T: if [B8.2]
-// CHECK: Preds (1): B10
-// CHECK: Succs (2): B7 B6
-// CHECK: [B9]
-// CHECK: 1: [B10.2].~A() (Implicit destructor)
+// CHECK: 2: [B7.1] (ImplicitCastExpr, LValueToRValue, _Bool)
+// CHECK: T: if [B7.2]
+// CHECK: Preds (1): B9
+// CHECK: Succs (2): B6 B5
+// CHECK: [B8]
+// CHECK: 1: [B9.2].~A() (Implicit destructor)
// CHECK: T: break;
-// CHECK: Preds (1): B10
+// CHECK: Preds (1): B9
// CHECK: Succs (1): B1
-// CHECK: [B10]
+// CHECK: [B9]
// CHECK: 1: (CXXConstructExpr, class A)
// CHECK: 2: A d;
// CHECK: 3: UV
-// CHECK: 4: [B10.3] (ImplicitCastExpr, LValueToRValue, _Bool)
-// CHECK: T: if [B10.4]
-// CHECK: Preds (1): B2
-// CHECK: Succs (2): B9 B8
+// CHECK: 4: [B9.3] (ImplicitCastExpr, LValueToRValue, _Bool)
+// CHECK: T: if [B9.4]
+// CHECK: Preds (1): B10
+// CHECK: Succs (2): B8 B7
+// CHECK: [B10]
+// CHECK: 1: b
+// CHECK: 2: [B10.1] (ImplicitCastExpr, NoOp, const class A)
+// CHECK: 3: [B10.2] (CXXConstructExpr, class A)
+// CHECK: 4: A c = b;
+// CHECK: 5: c
+// CHECK: 6: [B10.5] (ImplicitCastExpr, NoOp, const class A)
+// CHECK: 7: [B10.6].operator int
+// CHECK: 8: [B10.7]()
+// CHECK: 9: [B10.8] (ImplicitCastExpr, UserDefinedConversion, int)
+// CHECK: 10: [B10.9] (ImplicitCastExpr, IntegralToBoolean, _Bool)
+// CHECK: T: for (...; [B10.10]; )
+// CHECK: Preds (2): B2 B11
+// CHECK: Succs (2): B9 B1
// CHECK: [B11]
// CHECK: 1: (CXXConstructExpr, class A)
// CHECK: 2: A a;
// CHECK: 3: (CXXConstructExpr, class A)
// CHECK: 4: A b;
// CHECK: Preds (1): B12
-// CHECK: Succs (1): B2
+// CHECK: Succs (1): B10
// CHECK: [B0 (EXIT)]
-// CHECK: Preds (2): B1 B5
+// CHECK: Preds (2): B1 B4
// CHECK: [B3 (ENTRY)]
// CHECK: Succs (1): B0
// CHECK: [B1]
@@ -862,3 +862,4 @@ void test_catch_copy() {
// CHECK: Succs (1): B0
// CHECK: [B0 (EXIT)]
// CHECK: Preds (3): B2 B1 B3
+
diff --git a/clang/test/Analysis/domtest.c b/clang/test/Analysis/domtest.c
index 245186a1c23..0f370db5c13 100644
--- a/clang/test/Analysis/domtest.c
+++ b/clang/test/Analysis/domtest.c
@@ -1,4 +1,6 @@
-// RUN: %clang -cc1 -analyze -analyzer-checker=debug.DumpDominators %s 2>&1 | FileCheck %s
+// RUN: rm -f %t
+// RUN: %clang -cc1 -analyze -analyzer-checker=debug.DumpDominators %s > %t 2>&1
+// RUN: FileCheck --input-file=%t %s
// Test the DominatorsTree implementation with various control flows
int test1()
@@ -24,13 +26,13 @@ int test1()
// CHECK: Immediate dominance tree (Node#,IDom#):
// CHECK: (0,1)
-// CHECK: (1,2)
-// CHECK: (2,8)
-// CHECK: (3,4)
-// CHECK: (4,7)
-// CHECK: (5,7)
+// CHECK: (1,7)
+// CHECK: (2,3)
+// CHECK: (3,6)
+// CHECK: (4,6)
+// CHECK: (5,6)
// CHECK: (6,7)
-// CHECK: (7,2)
+// CHECK: (7,8)
// CHECK: (8,9)
// CHECK: (9,9)
@@ -55,9 +57,9 @@ int test2()
// CHECK: Immediate dominance tree (Node#,IDom#):
// CHECK: (0,1)
// CHECK: (1,6)
-// CHECK: (2,6)
+// CHECK: (2,3)
// CHECK: (3,4)
-// CHECK: (4,2)
+// CHECK: (4,6)
// CHECK: (5,6)
// CHECK: (6,7)
// CHECK: (7,7)
@@ -83,11 +85,11 @@ int test3()
// CHECK: Immediate dominance tree (Node#,IDom#):
// CHECK: (0,1)
// CHECK: (1,7)
-// CHECK: (2,7)
+// CHECK: (2,5)
// CHECK: (3,4)
-// CHECK: (4,2)
+// CHECK: (4,5)
// CHECK: (5,6)
-// CHECK: (6,4)
+// CHECK: (6,7)
// CHECK: (7,8)
// CHECK: (8,8)
@@ -108,16 +110,16 @@ int test4()
// CHECK: Immediate dominance tree (Node#,IDom#):
// CHECK: (0,1)
-// CHECK: (1,2)
-// CHECK: (2,11)
-// CHECK: (3,10)
-// CHECK: (4,10)
-// CHECK: (5,6)
-// CHECK: (6,4)
-// CHECK: (7,10)
+// CHECK: (1,10)
+// CHECK: (2,9)
+// CHECK: (3,4)
+// CHECK: (4,5)
+// CHECK: (5,9)
+// CHECK: (6,7)
+// CHECK: (7,8)
// CHECK: (8,9)
-// CHECK: (9,7)
-// CHECK: (10,2)
+// CHECK: (9,10)
+// CHECK: (10,11)
// CHECK: (11,12)
// CHECK: (12,12)
@@ -163,3 +165,4 @@ int test5()
// CHECK: (10,11)
// CHECK: (11,11)
+
diff --git a/clang/test/Analysis/temp-obj-dtors-cfg-output.cpp b/clang/test/Analysis/temp-obj-dtors-cfg-output.cpp
index 53ab211615c..1a1b1328622 100644
--- a/clang/test/Analysis/temp-obj-dtors-cfg-output.cpp
+++ b/clang/test/Analysis/temp-obj-dtors-cfg-output.cpp
@@ -1,4 +1,6 @@
-// RUN: %clang_cc1 -analyze -analyzer-checker=debug.DumpCFG -cfg-add-implicit-dtors -cfg-add-initializers %s 2>&1 | FileCheck %s
+// RUN: rm -f %t
+// RUN: %clang_cc1 -analyze -analyzer-checker=debug.DumpCFG -cfg-add-implicit-dtors -cfg-add-initializers %s > %t 2>&1
+// RUN: FileCheck --input-file=%t %s
// XPASS: *
class A {
@@ -106,9 +108,88 @@ TestCtorInits::TestCtorInits()
: a(int(A()) + int(B()))
, b() {}
+// CHECK: [B1 (ENTRY)]
+// CHECK: Succs (1): B0
+// CHECK: [B0 (EXIT)]
+// CHECK: Preds (1): B1
+// CHECK: [B1 (ENTRY)]
+// CHECK: Succs (1): B0
+// CHECK: [B0 (EXIT)]
+// CHECK: Preds (1): B1
+// CHECK: [B2 (ENTRY)]
+// CHECK: Succs (1): B1
+// CHECK: [B1]
+// CHECK: 1: A() (CXXConstructExpr, class A)
+// CHECK: 2: [B1.1] (BindTemporary)
+// CHECK: 3: [B1.2] (ImplicitCastExpr, NoOp, const class A)
+// CHECK: 4: [B1.3]
+// CHECK: 5: [B1.4] (CXXConstructExpr, class A)
+// CHECK: 6: ~A() (Temporary object destructor)
+// CHECK: 7: return [B1.5];
+// CHECK: Preds (1): B2
+// CHECK: Succs (1): B0
+// CHECK: [B0 (EXIT)]
+// CHECK: Preds (1): B1
+// CHECK: [B2 (ENTRY)]
+// CHECK: Succs (1): B1
+// CHECK: [B1]
+// CHECK: 1: false
+// CHECK: 2: return [B1.1];
+// CHECK: Preds (1): B2
+// CHECK: Succs (1): B0
+// CHECK: [B0 (EXIT)]
+// CHECK: Preds (1): B1
+// CHECK: [B2 (ENTRY)]
+// CHECK: Succs (1): B1
+// CHECK: [B1]
+// CHECK: 1: 0
+// CHECK: 2: return [B1.1];
+// CHECK: Preds (1): B2
+// CHECK: Succs (1): B0
+// CHECK: [B0 (EXIT)]
+// CHECK: Preds (1): B1
+// CHECK: [B1 (ENTRY)]
+// CHECK: Succs (1): B0
+// CHECK: [B0 (EXIT)]
+// CHECK: Preds (1): B1
+// CHECK: [B1 (ENTRY)]
+// CHECK: Succs (1): B0
+// CHECK: [B0 (EXIT)]
+// CHECK: Preds (1): B1
+// CHECK: [B2 (ENTRY)]
+// CHECK: Succs (1): B1
+// CHECK: [B1]
+// CHECK: 1: true
+// CHECK: 2: return [B1.1];
+// CHECK: Preds (1): B2
+// CHECK: Succs (1): B0
+// CHECK: [B0 (EXIT)]
+// CHECK: Preds (1): B1
+// CHECK: [B2 (ENTRY)]
+// CHECK: Succs (1): B1
+// CHECK: [B1]
+// CHECK: 1: 1
+// CHECK: 2: return [B1.1];
+// CHECK: Preds (1): B2
+// CHECK: Succs (1): B0
+// CHECK: [B0 (EXIT)]
+// CHECK: Preds (1): B1
+// CHECK: [B2 (ENTRY)]
+// CHECK: Succs (1): B1
+// CHECK: [B1]
+// CHECK: 1: A() (CXXConstructExpr, class A)
+// CHECK: 2: [B1.1] (BindTemporary)
+// CHECK: 3: [B1.2] (ImplicitCastExpr, NoOp, const class A)
+// CHECK: 4: [B1.3]
+// CHECK: 5: [B1.4] (CXXConstructExpr, class A)
+// CHECK: 6: ~A() (Temporary object destructor)
+// CHECK: 7: return [B1.5];
+// CHECK: Preds (1): B2
+// CHECK: Succs (1): B0
+// CHECK: [B0 (EXIT)]
+// CHECK: Preds (1): B1
// CHECK: [B2 (ENTRY)]
// CHECK: Succs (1): B1
-
// CHECK: [B1]
// CHECK: 1: A() (CXXConstructExpr, class A)
// CHECK: 2: [B1.1] (BindTemporary)
@@ -150,7 +231,7 @@ TestCtorInits::TestCtorInits()
// CHECK: [B0 (EXIT)]
// CHECK: Preds (1): B1
// CHECK: [B10 (ENTRY)]
-// CHECK: Succs (1): B8
+// CHECK: Succs (1): B9
// CHECK: [B1]
// CHECK: 1: ~A() (Temporary object destructor)
// CHECK: 2: int b;
@@ -161,62 +242,62 @@ TestCtorInits::TestCtorInits()
// CHECK: Preds (1): B3
// CHECK: Succs (1): B1
// CHECK: [B3]
-// CHECK: 1: [B4.6] && [B5.5]
+// CHECK: 1: [B5.6] && [B4.5]
// CHECK: 2: foo
// CHECK: 3: [B3.2] (ImplicitCastExpr, FunctionToPointerDecay, void (*)(_Bool))
// CHECK: 4: [B3.3]([B3.1])
-// CHECK: T: [B4.6] && ...
-// CHECK: Preds (2): B5 B4
+// CHECK: T: [B5.6] && ...
+// CHECK: Preds (2): B4 B5
// CHECK: Succs (2): B2 B1
// CHECK: [B4]
+// CHECK: 1: B() (CXXConstructExpr, class B)
+// CHECK: 2: [B4.1] (BindTemporary)
+// CHECK: 3: [B4.2].operator _Bool
+// CHECK: 4: [B4.3]()
+// CHECK: 5: [B4.4] (ImplicitCastExpr, UserDefinedConversion, _Bool)
+// CHECK: Preds (1): B5
+// CHECK: Succs (1): B3
+// CHECK: [B5]
// CHECK: 1: ~A() (Temporary object destructor)
// CHECK: 2: A() (CXXConstructExpr, class A)
-// CHECK: 3: [B4.2] (BindTemporary)
-// CHECK: 4: [B4.3].operator _Bool
-// CHECK: 5: [B4.4]()
-// CHECK: 6: [B4.5] (ImplicitCastExpr, UserDefinedConversion, _Bool)
-// CHECK: T: [B4.6] && ...
+// CHECK: 3: [B5.2] (BindTemporary)
+// CHECK: 4: [B5.3].operator _Bool
+// CHECK: 5: [B5.4]()
+// CHECK: 6: [B5.5] (ImplicitCastExpr, UserDefinedConversion, _Bool)
+// CHECK: T: [B5.6] && ...
// CHECK: Preds (2): B6 B7
-// CHECK: Succs (2): B5 B3
-// CHECK: [B5]
-// CHECK: 1: B() (CXXConstructExpr, class B)
-// CHECK: 2: [B5.1] (BindTemporary)
-// CHECK: 3: [B5.2].operator _Bool
-// CHECK: 4: [B5.3]()
-// CHECK: 5: [B5.4] (ImplicitCastExpr, UserDefinedConversion, _Bool)
-// CHECK: Preds (1): B4
-// CHECK: Succs (1): B3
+// CHECK: Succs (2): B4 B3
// CHECK: [B6]
// CHECK: 1: ~B() (Temporary object destructor)
// CHECK: Preds (1): B7
-// CHECK: Succs (1): B4
+// CHECK: Succs (1): B5
// CHECK: [B7]
-// CHECK: 1: [B8.5] && [B9.5]
+// CHECK: 1: [B9.5] && [B8.5]
// CHECK: 2: bool a = A().operator _Bool() && B().operator _Bool();
-// CHECK: T: [B8.5] && ...
-// CHECK: Preds (2): B9 B8
-// CHECK: Succs (2): B6 B4
+// CHECK: T: [B9.5] && ...
+// CHECK: Preds (2): B8 B9
+// CHECK: Succs (2): B6 B5
// CHECK: [B8]
-// CHECK: 1: A() (CXXConstructExpr, class A)
+// CHECK: 1: B() (CXXConstructExpr, class B)
// CHECK: 2: [B8.1] (BindTemporary)
// CHECK: 3: [B8.2].operator _Bool
// CHECK: 4: [B8.3]()
// CHECK: 5: [B8.4] (ImplicitCastExpr, UserDefinedConversion, _Bool)
-// CHECK: T: [B8.5] && ...
-// CHECK: Preds (1): B10
-// CHECK: Succs (2): B9 B7
+// CHECK: Preds (1): B9
+// CHECK: Succs (1): B7
// CHECK: [B9]
-// CHECK: 1: B() (CXXConstructExpr, class B)
+// CHECK: 1: A() (CXXConstructExpr, class A)
// CHECK: 2: [B9.1] (BindTemporary)
// CHECK: 3: [B9.2].operator _Bool
// CHECK: 4: [B9.3]()
// CHECK: 5: [B9.4] (ImplicitCastExpr, UserDefinedConversion, _Bool)
-// CHECK: Preds (1): B8
-// CHECK: Succs (1): B7
+// CHECK: T: [B9.5] && ...
+// CHECK: Preds (1): B10
+// CHECK: Succs (2): B8 B7
// CHECK: [B0 (EXIT)]
// CHECK: Preds (1): B1
// CHECK: [B10 (ENTRY)]
-// CHECK: Succs (1): B8
+// CHECK: Succs (1): B9
// CHECK: [B1]
// CHECK: 1: ~A() (Temporary object destructor)
// CHECK: 2: int b;
@@ -227,58 +308,58 @@ TestCtorInits::TestCtorInits()
// CHECK: Preds (1): B3
// CHECK: Succs (1): B1
// CHECK: [B3]
-// CHECK: 1: [B4.6] || [B5.5]
+// CHECK: 1: [B5.6] || [B4.5]
// CHECK: 2: foo
// CHECK: 3: [B3.2] (ImplicitCastExpr, FunctionToPointerDecay, void (*)(_Bool))
// CHECK: 4: [B3.3]([B3.1])
-// CHECK: T: [B4.6] || ...
-// CHECK: Preds (2): B5 B4
+// CHECK: T: [B5.6] || ...
+// CHECK: Preds (2): B4 B5
// CHECK: Succs (2): B1 B2
// CHECK: [B4]
+// CHECK: 1: B() (CXXConstructExpr, class B)
+// CHECK: 2: [B4.1] (BindTemporary)
+// CHECK: 3: [B4.2].operator _Bool
+// CHECK: 4: [B4.3]()
+// CHECK: 5: [B4.4] (ImplicitCastExpr, UserDefinedConversion, _Bool)
+// CHECK: Preds (1): B5
+// CHECK: Succs (1): B3
+// CHECK: [B5]
// CHECK: 1: ~A() (Temporary object destructor)
// CHECK: 2: A() (CXXConstructExpr, class A)
-// CHECK: 3: [B4.2] (BindTemporary)
-// CHECK: 4: [B4.3].operator _Bool
-// CHECK: 5: [B4.4]()
-// CHECK: 6: [B4.5] (ImplicitCastExpr, UserDefinedConversion, _Bool)
-// CHECK: T: [B4.6] || ...
+// CHECK: 3: [B5.2] (BindTemporary)
+// CHECK: 4: [B5.3].operator _Bool
+// CHECK: 5: [B5.4]()
+// CHECK: 6: [B5.5] (ImplicitCastExpr, UserDefinedConversion, _Bool)
+// CHECK: T: [B5.6] || ...
// CHECK: Preds (2): B6 B7
-// CHECK: Succs (2): B3 B5
-// CHECK: [B5]
-// CHECK: 1: B() (CXXConstructExpr, class B)
-// CHECK: 2: [B5.1] (BindTemporary)
-// CHECK: 3: [B5.2].operator _Bool
-// CHECK: 4: [B5.3]()
-// CHECK: 5: [B5.4] (ImplicitCastExpr, UserDefinedConversion, _Bool)
-// CHECK: Preds (1): B4
-// CHECK: Succs (1): B3
+// CHECK: Succs (2): B3 B4
// CHECK: [B6]
// CHECK: 1: ~B() (Temporary object destructor)
// CHECK: Preds (1): B7
-// CHECK: Succs (1): B4
+// CHECK: Succs (1): B5
// CHECK: [B7]
-// CHECK: 1: [B8.5] || [B9.5]
+// CHECK: 1: [B9.5] || [B8.5]
// CHECK: 2: bool a = A().operator _Bool() || B().operator _Bool();
-// CHECK: T: [B8.5] || ...
-// CHECK: Preds (2): B9 B8
-// CHECK: Succs (2): B4 B6
+// CHECK: T: [B9.5] || ...
+// CHECK: Preds (2): B8 B9
+// CHECK: Succs (2): B5 B6
// CHECK: [B8]
-// CHECK: 1: A() (CXXConstructExpr, class A)
+// CHECK: 1: B() (CXXConstructExpr, class B)
// CHECK: 2: [B8.1] (BindTemporary)
// CHECK: 3: [B8.2].operator _Bool
// CHECK: 4: [B8.3]()
// CHECK: 5: [B8.4] (ImplicitCastExpr, UserDefinedConversion, _Bool)
-// CHECK: T: [B8.5] || ...
-// CHECK: Preds (1): B10
-// CHECK: Succs (2): B7 B9
+// CHECK: Preds (1): B9
+// CHECK: Succs (1): B7
// CHECK: [B9]
-// CHECK: 1: B() (CXXConstructExpr, class B)
+// CHECK: 1: A() (CXXConstructExpr, class A)
// CHECK: 2: [B9.1] (BindTemporary)
// CHECK: 3: [B9.2].operator _Bool
// CHECK: 4: [B9.3]()
// CHECK: 5: [B9.4] (ImplicitCastExpr, UserDefinedConversion, _Bool)
-// CHECK: Preds (1): B8
-// CHECK: Succs (1): B7
+// CHECK: T: [B9.5] || ...
+// CHECK: Preds (1): B10
+// CHECK: Succs (2): B7 B8
// CHECK: [B0 (EXIT)]
// CHECK: Preds (1): B1
// CHECK: [B11 (ENTRY)]
OpenPOWER on IntegriCloud