1 // RUN: %clang_analyze_cc1 -w -analyzer-checker=debug.DumpLiveStmts %s 2>&1\ 2 // RUN: | FileCheck %s 3 4 int coin(); 5 6 7 int testThatDumperWorks(int x, int y, int z) { 8 return x ? y : z; 9 } 10 // CHECK: [ B0 (live statements at block exit) ] 11 // CHECK-EMPTY: 12 // CHECK-EMPTY: 13 // CHECK: [ B1 (live statements at block exit) ] 14 // CHECK-EMPTY: 15 // CHECK-EMPTY: 16 // CHECK: [ B2 (live statements at block exit) ] 17 // CHECK-EMPTY: 18 // CHECK-NEXT: DeclRefExpr {{.*}} 'y' 'int' 19 // CHECK-EMPTY: 20 // CHECK-NEXT: DeclRefExpr {{.*}} 'z' 'int' 21 // CHECK-EMPTY: 22 // CHECK-NEXT: ImplicitCastExpr {{.*}} <IntegralToBoolean> 23 // CHECK-NEXT: `-ImplicitCastExpr {{.*}} <LValueToRValue> 24 // CHECK-NEXT: `-DeclRefExpr {{.*}} 'x' 'int' 25 // CHECK-EMPTY: 26 // CHECK-EMPTY: 27 // CHECK: [ B3 (live statements at block exit) ] 28 // CHECK-EMPTY: 29 // CHECK-NEXT: DeclRefExpr {{.*}} 'y' 'int' 30 // CHECK-EMPTY: 31 // CHECK-NEXT: DeclRefExpr {{.*}} 'z' 'int' 32 // CHECK-EMPTY: 33 // CHECK-NEXT: ImplicitCastExpr {{.*}} <IntegralToBoolean> 34 // CHECK-NEXT: `-ImplicitCastExpr {{.*}} <LValueToRValue> 35 // CHECK-NEXT: `-DeclRefExpr {{.*}} 'x' 'int' 36 // CHECK: [ B4 (live statements at block exit) ] 37 // CHECK-EMPTY: 38 // CHECK-NEXT: DeclRefExpr {{.*}} 'y' 'int' 39 // CHECK-EMPTY: 40 // CHECK-NEXT: DeclRefExpr {{.*}} 'z' 'int' 41 // CHECK-EMPTY: 42 // CHECK-NEXT: ImplicitCastExpr {{.*}} <IntegralToBoolean> 43 // CHECK-NEXT: `-ImplicitCastExpr {{.*}} <LValueToRValue> 44 // CHECK-NEXT: `-DeclRefExpr {{.*}} 'x' 'int' 45 // CHECK-EMPTY: 46 // CHECK-EMPTY: 47 // CHECK: [ B5 (live statements at block exit) ] 48 // CHECK-EMPTY: 49 // CHECK-NEXT: DeclRefExpr {{.*}} 'y' 'int' 50 // CHECK-EMPTY: 51 // CHECK-NEXT: DeclRefExpr {{.*}} 'z' 'int' 52 // CHECK-EMPTY: 53 // CHECK-EMPTY: 54 55 56 void testIfBranchExpression(bool flag) { 57 // No expressions should be carried over from one block to another here. 58 while (flag) { 59 int e = 1; 60 if (true) 61 e; 62 } 63 } 64 // CHECK: [ B0 (live statements at block exit) ] 65 // CHECK-EMPTY: 66 // CHECK-EMPTY: 67 // CHECK: [ B1 (live statements at block exit) ] 68 // CHECK-EMPTY: 69 // CHECK-EMPTY: 70 // CHECK: [ B2 (live statements at block exit) ] 71 // CHECK-EMPTY: 72 // CHECK-EMPTY: 73 // CHECK: [ B3 (live statements at block exit) ] 74 // CHECK-EMPTY: 75 // CHECK-EMPTY: 76 // CHECK: [ B4 (live statements at block exit) ] 77 // CHECK-EMPTY: 78 // CHECK-EMPTY: 79 // CHECK: [ B5 (live statements at block exit) ] 80 // CHECK-EMPTY: 81 // CHECK-EMPTY: 82 83 84 void testWhileBodyExpression(bool flag) { 85 // No expressions should be carried over from one block to another here. 86 while (flag) { 87 int e = 1; 88 while (coin()) 89 e; 90 } 91 } 92 // CHECK: [ B0 (live statements at block exit) ] 93 // CHECK-EMPTY: 94 // CHECK-EMPTY: 95 // CHECK: [ B1 (live statements at block exit) ] 96 // CHECK-EMPTY: 97 // CHECK-EMPTY: 98 // CHECK: [ B2 (live statements at block exit) ] 99 // CHECK-EMPTY: 100 // CHECK-EMPTY: 101 // CHECK: [ B3 (live statements at block exit) ] 102 // CHECK-EMPTY: 103 // CHECK-EMPTY: 104 // CHECK: [ B4 (live statements at block exit) ] 105 // CHECK-EMPTY: 106 // CHECK-EMPTY: 107 // CHECK: [ B5 (live statements at block exit) ] 108 // CHECK-EMPTY: 109 // CHECK-EMPTY: 110 111 112 void testDoWhileBodyExpression(bool flag) { 113 // No expressions should be carried over from one block to another here. 114 while (flag) { 115 int e = 1; 116 do 117 e; 118 while (coin()); 119 } 120 } 121 // CHECK: [ B0 (live statements at block exit) ] 122 // CHECK-EMPTY: 123 // CHECK-EMPTY: 124 // CHECK: [ B1 (live statements at block exit) ] 125 // CHECK-EMPTY: 126 // CHECK-EMPTY: 127 // CHECK: [ B2 (live statements at block exit) ] 128 // CHECK-EMPTY: 129 // CHECK-EMPTY: 130 // CHECK: [ B3 (live statements at block exit) ] 131 // CHECK-EMPTY: 132 // CHECK-EMPTY: 133 // CHECK: [ B4 (live statements at block exit) ] 134 // CHECK-EMPTY: 135 // CHECK-EMPTY: 136 // CHECK: [ B5 (live statements at block exit) ] 137 // CHECK-EMPTY: 138 // CHECK-EMPTY: 139 140 141 void testForBodyExpression(bool flag) { 142 // No expressions should be carried over from one block to another here. 143 while (flag) { 144 int e = 1; 145 for (; coin();) 146 e; 147 } 148 } 149 // CHECK: [ B0 (live statements at block exit) ] 150 // CHECK-EMPTY: 151 // CHECK-EMPTY: 152 // CHECK: [ B1 (live statements at block exit) ] 153 // CHECK-EMPTY: 154 // CHECK-EMPTY: 155 // CHECK: [ B2 (live statements at block exit) ] 156 // CHECK-EMPTY: 157 // CHECK-EMPTY: 158 // CHECK: [ B3 (live statements at block exit) ] 159 // CHECK-EMPTY: 160 // CHECK-EMPTY: 161 // CHECK: [ B4 (live statements at block exit) ] 162 // CHECK-EMPTY: 163 // CHECK-EMPTY: 164 // CHECK: [ B5 (live statements at block exit) ] 165 // CHECK-EMPTY: 166 // CHECK-EMPTY: 167 168