summaryrefslogtreecommitdiffstats
path: root/clang/test
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
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')
-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
-rw-r--r--clang/test/Sema/uninit-variables.c8
-rw-r--r--clang/test/SemaCXX/uninitialized.cpp2
5 files changed, 320 insertions, 235 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)]
diff --git a/clang/test/Sema/uninit-variables.c b/clang/test/Sema/uninit-variables.c
index 71ce76c3e31..2630b70ec08 100644
--- a/clang/test/Sema/uninit-variables.c
+++ b/clang/test/Sema/uninit-variables.c
@@ -152,15 +152,15 @@ int test19() {
int test20() {
int z; // expected-note{{initialize the variable 'z' to silence this warning}}
- if ((test19_aux1() + test19_aux2() && test19_aux1()) || test19_aux3(&z))
- return z; // expected-warning{{variable 'z' may be uninitialized when used here}}
+ if ((test19_aux1() + test19_aux2() && test19_aux1()) || test19_aux3(&z)) // expected-warning {{variable 'z' is used uninitialized whenever '||' condition is true}} expected-note {{remove the '||' if its condition is always false}}
+ return z; // expected-note {{uninitialized use occurs here}}
return 0;
}
int test21(int x, int y) {
int z; // expected-note{{initialize the variable 'z' to silence this warning}}
- if ((x && y) || test19_aux3(&z) || test19_aux2())
- return z; // expected-warning{{variable 'z' may be uninitialized when used here}}
+ if ((x && y) || test19_aux3(&z) || test19_aux2()) // expected-warning {{variable 'z' is used uninitialized whenever '||' condition is true}} expected-note {{remove the '||' if its condition is always false}}
+ return z; // expected-note {{uninitialized use occurs here}}
return 0;
}
diff --git a/clang/test/SemaCXX/uninitialized.cpp b/clang/test/SemaCXX/uninitialized.cpp
index b15779443d8..e8272362310 100644
--- a/clang/test/SemaCXX/uninitialized.cpp
+++ b/clang/test/SemaCXX/uninitialized.cpp
@@ -25,7 +25,7 @@ int l = k ? l : l; // expected-warning 2{{variable 'l' is uninitialized when us
int m = 1 + (k ? m : m); // expected-warning 2{{variable 'm' is uninitialized when used within its own initialization}}
int n = -n; // expected-warning {{variable 'n' is uninitialized when used within its own initialization}}
-void test () {
+void test_stuff () {
int a = a; // no-warning: used to signal intended lack of initialization.
int b = b + 1; // expected-warning {{variable 'b' is uninitialized when used within its own initialization}}
int c = (c + c); // expected-warning {{variable 'c' is uninitialized when used within its own initialization}}
OpenPOWER on IntegriCloud