1 // RUN: %clang_cc1 -fcxx-exceptions -fexceptions -analyze -analyzer-checker=debug.DumpCFG -analyzer-config cfg-scopes=true %s > %t 2>&1 2 // RUN: FileCheck --input-file=%t %s 3 4 class A { 5 public: 6 // CHECK: [B1 (ENTRY)] 7 // CHECK-NEXT: Succs (1): B0 8 // CHECK: [B0 (EXIT)] 9 // CHECK-NEXT: Preds (1): B1 10 A() {} 11 12 // CHECK: [B1 (ENTRY)] 13 // CHECK-NEXT: Succs (1): B0 14 // CHECK: [B0 (EXIT)] 15 // CHECK-NEXT: Preds (1): B1 16 ~A() {} 17 18 // CHECK: [B2 (ENTRY)] 19 // CHECK-NEXT: Succs (1): B1 20 // CHECK: [B1] 21 // CHECK-NEXT: 1: 1 22 // CHECK-NEXT: 2: return [B1.1]; 23 // CHECK-NEXT: Preds (1): B2 24 // CHECK-NEXT: Succs (1): B0 25 // CHECK: [B0 (EXIT)] 26 // CHECK-NEXT: Preds (1): B1 27 operator int() const { return 1; } 28 int *p; 29 }; 30 31 int getX(); 32 extern const bool UV; 33 34 // CHECK: [B2 (ENTRY)] 35 // CHECK-NEXT: Succs (1): B1 36 // CHECK: [B1] 37 // CHECK-NEXT: 1: CFGScopeBegin(a) 38 // CHECK-NEXT: 2: (CXXConstructExpr, [B1.3], A[2]) 39 // CHECK-NEXT: 3: A a[2]; 40 // CHECK-NEXT: 4: (CXXConstructExpr, [B1.5], A[0]) 41 // CHECK-NEXT: 5: A b[0]; 42 // CHECK-NEXT: 6: [B1.3].~A[2]() (Implicit destructor) 43 // CHECK-NEXT: 7: CFGScopeEnd(a) 44 // CHECK-NEXT: Preds (1): B2 45 // CHECK-NEXT: Succs (1): B0 46 // CHECK: [B0 (EXIT)] 47 // CHECK-NEXT: Preds (1): B1 48 void test_array() { 49 A a[2]; 50 A b[0]; 51 } 52 53 // CHECK: [B2 (ENTRY)] 54 // CHECK-NEXT: Succs (1): B1 55 // CHECK: [B1] 56 // CHECK-NEXT: 1: CFGScopeBegin(a) 57 // CHECK-NEXT: 2: (CXXConstructExpr, [B1.3], A) 58 // CHECK-NEXT: 3: A a; 59 // CHECK-NEXT: 4: CFGScopeBegin(c) 60 // CHECK-NEXT: 5: (CXXConstructExpr, [B1.6], A) 61 // CHECK-NEXT: 6: A c; 62 // CHECK-NEXT: 7: (CXXConstructExpr, [B1.8], A) 63 // CHECK-NEXT: 8: A d; 64 // CHECK-NEXT: 9: [B1.8].~A() (Implicit destructor) 65 // CHECK-NEXT: 10: [B1.6].~A() (Implicit destructor) 66 // CHECK-NEXT: 11: CFGScopeEnd(c) 67 // CHECK-NEXT: 12: (CXXConstructExpr, [B1.13], A) 68 // CHECK-NEXT: 13: A b; 69 // CHECK-NEXT: 14: [B1.13].~A() (Implicit destructor) 70 // CHECK-NEXT: 15: [B1.3].~A() (Implicit destructor) 71 // CHECK-NEXT: 16: CFGScopeEnd(a) 72 // CHECK-NEXT: Preds (1): B2 73 // CHECK-NEXT: Succs (1): B0 74 // CHECK: [B0 (EXIT)] 75 // CHECK-NEXT: Preds (1): B1 76 void test_scope() { 77 A a; 78 { A c; 79 A d; 80 } 81 A b; 82 } 83 84 // CHECK: [B4 (ENTRY)] 85 // CHECK-NEXT: Succs (1): B3 86 // CHECK: [B1] 87 // CHECK-NEXT: 1: (CXXConstructExpr, [B1.2], A) 88 // CHECK-NEXT: 2: A c; 89 // CHECK-NEXT: 3: [B1.2].~A() (Implicit destructor) 90 // CHECK-NEXT: 4: [B3.5].~A() (Implicit destructor) 91 // CHECK-NEXT: 5: [B3.3].~A() (Implicit destructor) 92 // CHECK-NEXT: 6: CFGScopeEnd(a) 93 // CHECK-NEXT: Preds (1): B3 94 // CHECK-NEXT: Succs (1): B0 95 // CHECK: [B2] 96 // CHECK-NEXT: 1: return; 97 // CHECK-NEXT: 2: [B3.5].~A() (Implicit destructor) 98 // CHECK-NEXT: 3: [B3.3].~A() (Implicit destructor) 99 // CHECK-NEXT: 4: CFGScopeEnd(a) 100 // CHECK-NEXT: Preds (1): B3 101 // CHECK-NEXT: Succs (1): B0 102 // CHECK: [B3] 103 // CHECK-NEXT: 1: CFGScopeBegin(a) 104 // CHECK-NEXT: 2: (CXXConstructExpr, [B3.3], A) 105 // CHECK-NEXT: 3: A a; 106 // CHECK-NEXT: 4: (CXXConstructExpr, [B3.5], A) 107 // CHECK-NEXT: 5: A b; 108 // CHECK-NEXT: 6: UV 109 // CHECK-NEXT: 7: [B3.6] (ImplicitCastExpr, LValueToRValue, _Bool) 110 // CHECK-NEXT: T: if [B3.7] 111 // CHECK-NEXT: Preds (1): B4 112 // CHECK-NEXT: Succs (2): B2 B1 113 // CHECK: [B0 (EXIT)] 114 // CHECK-NEXT: Preds (2): B1 B2 115 void test_return() { 116 A a; 117 A b; 118 if (UV) return; 119 A c; 120 } 121 122 // CHECK: [B5 (ENTRY)] 123 // CHECK-NEXT: Succs (1): B4 124 // CHECK: [B1] 125 // CHECK-NEXT: 1: [B4.8].~A() (Implicit destructor) 126 // CHECK-NEXT: 2: CFGScopeEnd(b) 127 // CHECK-NEXT: 3: [B4.3].~A() (Implicit destructor) 128 // CHECK-NEXT: 4: CFGScopeEnd(a) 129 // CHECK-NEXT: Preds (2): B2 B3 130 // CHECK-NEXT: Succs (1): B0 131 // CHECK: [B2] 132 // CHECK-NEXT: 1: CFGScopeBegin(c) 133 // CHECK-NEXT: 2: (CXXConstructExpr, [B2.3], A) 134 // CHECK-NEXT: 3: A c; 135 // CHECK-NEXT: 4: [B2.3].~A() (Implicit destructor) 136 // CHECK-NEXT: 5: CFGScopeEnd(c) 137 // CHECK-NEXT: Preds (1): B4 138 // CHECK-NEXT: Succs (1): B1 139 // CHECK: [B3] 140 // CHECK-NEXT: 1: CFGScopeBegin(c) 141 // CHECK-NEXT: 2: (CXXConstructExpr, [B3.3], A) 142 // CHECK-NEXT: 3: A c; 143 // CHECK-NEXT: 4: [B3.3].~A() (Implicit destructor) 144 // CHECK-NEXT: 5: CFGScopeEnd(c) 145 // CHECK-NEXT: Preds (1): B4 146 // CHECK-NEXT: Succs (1): B1 147 // CHECK: [B4] 148 // CHECK-NEXT: 1: CFGScopeBegin(a) 149 // CHECK-NEXT: 2: (CXXConstructExpr, [B4.3], A) 150 // CHECK-NEXT: 3: A a; 151 // CHECK-NEXT: 4: CFGScopeBegin(b) 152 // CHECK-NEXT: 5: a 153 // CHECK-NEXT: 6: [B4.5] (ImplicitCastExpr, NoOp, const A) 154 // CHECK-NEXT: 7: [B4.6] (CXXConstructExpr, [B4.8], A) 155 // CHECK-NEXT: 8: A b = a; 156 // CHECK-NEXT: 9: b 157 // CHECK-NEXT: 10: [B4.9] (ImplicitCastExpr, NoOp, const class A) 158 // CHECK-NEXT: 11: [B4.10].operator int 159 // CHECK-NEXT: 12: [B4.10] 160 // CHECK-NEXT: 13: [B4.12] (ImplicitCastExpr, UserDefinedConversion, int) 161 // CHECK-NEXT: 14: [B4.13] (ImplicitCastExpr, IntegralToBoolean, _Bool) 162 // CHECK-NEXT: T: if [B4.14] 163 // CHECK-NEXT: Preds (1): B5 164 // CHECK-NEXT: Succs (2): B3 B2 165 // CHECK: [B0 (EXIT)] 166 // CHECK-NEXT: Preds (1): B1 167 void test_if_implicit_scope() { 168 A a; 169 if (A b = a) 170 A c; 171 else A c; 172 } 173 174 // CHECK: [B9 (ENTRY)] 175 // CHECK-NEXT: Succs (1): B8 176 // CHECK: [B1] 177 // CHECK-NEXT: 1: [B8.8].~A() (Implicit destructor) 178 // CHECK-NEXT: 2: CFGScopeEnd(b) 179 // CHECK-NEXT: 3: (CXXConstructExpr, [B1.4], A) 180 // CHECK-NEXT: 4: A e; 181 // CHECK-NEXT: 5: [B1.4].~A() (Implicit destructor) 182 // CHECK-NEXT: 6: [B8.3].~A() (Implicit destructor) 183 // CHECK-NEXT: 7: CFGScopeEnd(a) 184 // CHECK-NEXT: Preds (2): B2 B5 185 // CHECK-NEXT: Succs (1): B0 186 // CHECK: [B2] 187 // CHECK-NEXT: 1: (CXXConstructExpr, [B2.2], A) 188 // CHECK-NEXT: 2: A d; 189 // CHECK-NEXT: 3: [B2.2].~A() (Implicit destructor) 190 // CHECK-NEXT: 4: [B4.3].~A() (Implicit destructor) 191 // CHECK-NEXT: 5: CFGScopeEnd(c) 192 // CHECK-NEXT: Preds (1): B4 193 // CHECK-NEXT: Succs (1): B1 194 // CHECK: [B3] 195 // CHECK-NEXT: 1: return; 196 // CHECK-NEXT: 2: [B4.3].~A() (Implicit destructor) 197 // CHECK-NEXT: 3: CFGScopeEnd(c) 198 // CHECK-NEXT: 4: [B8.8].~A() (Implicit destructor) 199 // CHECK-NEXT: 5: CFGScopeEnd(b) 200 // CHECK-NEXT: 6: [B8.3].~A() (Implicit destructor) 201 // CHECK-NEXT: 7: CFGScopeEnd(a) 202 // CHECK-NEXT: Preds (1): B4 203 // CHECK-NEXT: Succs (1): B0 204 // CHECK: [B4] 205 // CHECK-NEXT: 1: CFGScopeBegin(c) 206 // CHECK-NEXT: 2: (CXXConstructExpr, [B4.3], A) 207 // CHECK-NEXT: 3: A c; 208 // CHECK-NEXT: 4: UV 209 // CHECK-NEXT: 5: [B4.4] (ImplicitCastExpr, LValueToRValue, _Bool) 210 // CHECK-NEXT: T: if [B4.5] 211 // CHECK-NEXT: Preds (1): B8 212 // CHECK-NEXT: Succs (2): B3 B2 213 // CHECK: [B5] 214 // CHECK-NEXT: 1: (CXXConstructExpr, [B5.2], A) 215 // CHECK-NEXT: 2: A d; 216 // CHECK-NEXT: 3: [B5.2].~A() (Implicit destructor) 217 // CHECK-NEXT: 4: [B7.3].~A() (Implicit destructor) 218 // CHECK-NEXT: 5: CFGScopeEnd(c) 219 // CHECK-NEXT: Preds (1): B7 220 // CHECK-NEXT: Succs (1): B1 221 // CHECK: [B6] 222 // CHECK-NEXT: 1: return; 223 // CHECK-NEXT: 2: [B7.3].~A() (Implicit destructor) 224 // CHECK-NEXT: 3: CFGScopeEnd(c) 225 // CHECK-NEXT: 4: [B8.8].~A() (Implicit destructor) 226 // CHECK-NEXT: 5: CFGScopeEnd(b) 227 // CHECK-NEXT: 6: [B8.3].~A() (Implicit destructor) 228 // CHECK-NEXT: 7: CFGScopeEnd(a) 229 // CHECK-NEXT: Preds (1): B7 230 // CHECK-NEXT: Succs (1): B0 231 // CHECK: [B7] 232 // CHECK-NEXT: 1: CFGScopeBegin(c) 233 // CHECK-NEXT: 2: (CXXConstructExpr, [B7.3], A) 234 // CHECK-NEXT: 3: A c; 235 // CHECK-NEXT: 4: UV 236 // CHECK-NEXT: 5: [B7.4] (ImplicitCastExpr, LValueToRValue, _Bool) 237 // CHECK-NEXT: T: if [B7.5] 238 // CHECK-NEXT: Preds (1): B8 239 // CHECK-NEXT: Succs (2): B6 B5 240 // CHECK: [B8] 241 // CHECK-NEXT: 1: CFGScopeBegin(a) 242 // CHECK-NEXT: 2: (CXXConstructExpr, [B8.3], A) 243 // CHECK-NEXT: 3: A a; 244 // CHECK-NEXT: 4: CFGScopeBegin(b) 245 // CHECK-NEXT: 5: a 246 // CHECK-NEXT: 6: [B8.5] (ImplicitCastExpr, NoOp, const A) 247 // CHECK-NEXT: 7: [B8.6] (CXXConstructExpr, [B8.8], A) 248 // CHECK-NEXT: 8: A b = a; 249 // CHECK-NEXT: 9: b 250 // CHECK-NEXT: 10: [B8.9] (ImplicitCastExpr, NoOp, const class A) 251 // CHECK-NEXT: 11: [B8.10].operator int 252 // CHECK-NEXT: 12: [B8.10] 253 // CHECK-NEXT: 13: [B8.12] (ImplicitCastExpr, UserDefinedConversion, int) 254 // CHECK-NEXT: 14: [B8.13] (ImplicitCastExpr, IntegralToBoolean, _Bool) 255 // CHECK-NEXT: T: if [B8.14] 256 // CHECK-NEXT: Preds (1): B9 257 // CHECK-NEXT: Succs (2): B7 B4 258 // CHECK: [B0 (EXIT)] 259 // CHECK-NEXT: Preds (3): B1 B3 B6 260 void test_if_jumps() { 261 A a; 262 if (A b = a) { 263 A c; 264 if (UV) return; 265 A d; 266 } else { 267 A c; 268 if (UV) return; 269 A d; 270 } 271 A e; 272 } 273 274 // CHECK: [B6 (ENTRY)] 275 // CHECK-NEXT: Succs (1): B5 276 // CHECK: [B1] 277 // CHECK-NEXT: 1: [B4.5].~A() (Implicit destructor) 278 // CHECK-NEXT: 2: CFGScopeEnd(b) 279 // CHECK-NEXT: 3: [B5.3].~A() (Implicit destructor) 280 // CHECK-NEXT: 4: CFGScopeEnd(a) 281 // CHECK-NEXT: Preds (1): B4 282 // CHECK-NEXT: Succs (1): B0 283 // CHECK: [B2] 284 // CHECK-NEXT: Preds (1): B3 285 // CHECK-NEXT: Succs (1): B4 286 // CHECK: [B3] 287 // CHECK-NEXT: 1: CFGScopeBegin(c) 288 // CHECK-NEXT: 2: (CXXConstructExpr, [B3.3], A) 289 // CHECK-NEXT: 3: A c; 290 // CHECK-NEXT: 4: [B3.3].~A() (Implicit destructor) 291 // CHECK-NEXT: 5: CFGScopeEnd(c) 292 // CHECK-NEXT: 6: [B4.5].~A() (Implicit destructor) 293 // CHECK-NEXT: 7: CFGScopeEnd(b) 294 // CHECK-NEXT: Preds (1): B4 295 // CHECK-NEXT: Succs (1): B2 296 // CHECK: [B4] 297 // CHECK-NEXT: 1: CFGScopeBegin(b) 298 // CHECK-NEXT: 2: a 299 // CHECK-NEXT: 3: [B4.2] (ImplicitCastExpr, NoOp, const A) 300 // CHECK-NEXT: 4: [B4.3] (CXXConstructExpr, [B4.5], A) 301 // CHECK-NEXT: 5: A b = a; 302 // CHECK-NEXT: 6: b 303 // CHECK-NEXT: 7: [B4.6] (ImplicitCastExpr, NoOp, const class A) 304 // CHECK-NEXT: 8: [B4.7].operator int 305 // CHECK-NEXT: 9: [B4.7] 306 // CHECK-NEXT: 10: [B4.9] (ImplicitCastExpr, UserDefinedConversion, int) 307 // CHECK-NEXT: 11: [B4.10] (ImplicitCastExpr, IntegralToBoolean, _Bool) 308 // CHECK-NEXT: T: while [B4.11] 309 // CHECK-NEXT: Preds (2): B2 B5 310 // CHECK-NEXT: Succs (2): B3 B1 311 // CHECK: [B5] 312 // CHECK-NEXT: 1: CFGScopeBegin(a) 313 // CHECK-NEXT: 2: (CXXConstructExpr, [B5.3], A) 314 // CHECK-NEXT: 3: A a; 315 // CHECK-NEXT: Preds (1): B6 316 // CHECK-NEXT: Succs (1): B4 317 // CHECK: [B0 (EXIT)] 318 // CHECK-NEXT: Preds (1): B1 319 void test_while_implicit_scope() { 320 A a; 321 while (A b = a) 322 A c; 323 } 324 325 // CHECK: [B12 (ENTRY)] 326 // CHECK-NEXT: Succs (1): B11 327 // CHECK: [B1] 328 // CHECK-NEXT: 1: [B10.5].~A() (Implicit destructor) 329 // CHECK-NEXT: 2: CFGScopeEnd(b) 330 // CHECK-NEXT: 3: (CXXConstructExpr, [B1.4], A) 331 // CHECK-NEXT: 4: A e; 332 // CHECK-NEXT: 5: [B1.4].~A() (Implicit destructor) 333 // CHECK-NEXT: 6: [B11.3].~A() (Implicit destructor) 334 // CHECK-NEXT: 7: CFGScopeEnd(a) 335 // CHECK-NEXT: Preds (2): B8 B10 336 // CHECK-NEXT: Succs (1): B0 337 // CHECK: [B2] 338 // CHECK-NEXT: Preds (2): B3 B6 339 // CHECK-NEXT: Succs (1): B10 340 // CHECK: [B3] 341 // CHECK-NEXT: 1: (CXXConstructExpr, [B3.2], A) 342 // CHECK-NEXT: 2: A d; 343 // CHECK-NEXT: 3: [B3.2].~A() (Implicit destructor) 344 // CHECK-NEXT: 4: [B9.3].~A() (Implicit destructor) 345 // CHECK-NEXT: 5: CFGScopeEnd(c) 346 // CHECK-NEXT: 6: [B10.5].~A() (Implicit destructor) 347 // CHECK-NEXT: 7: CFGScopeEnd(b) 348 // CHECK-NEXT: Preds (1): B5 349 // CHECK-NEXT: Succs (1): B2 350 // CHECK: [B4] 351 // CHECK-NEXT: 1: return; 352 // CHECK-NEXT: 2: [B9.3].~A() (Implicit destructor) 353 // CHECK-NEXT: 3: CFGScopeEnd(c) 354 // CHECK-NEXT: 4: [B10.5].~A() (Implicit destructor) 355 // CHECK-NEXT: 5: CFGScopeEnd(b) 356 // CHECK-NEXT: 6: [B11.3].~A() (Implicit destructor) 357 // CHECK-NEXT: 7: CFGScopeEnd(a) 358 // CHECK-NEXT: Preds (1): B5 359 // CHECK-NEXT: Succs (1): B0 360 // CHECK: [B5] 361 // CHECK-NEXT: 1: UV 362 // CHECK-NEXT: 2: [B5.1] (ImplicitCastExpr, LValueToRValue, _Bool) 363 // CHECK-NEXT: T: if [B5.2] 364 // CHECK-NEXT: Preds (1): B7 365 // CHECK-NEXT: Succs (2): B4 B3 366 // CHECK: [B6] 367 // CHECK-NEXT: 1: [B9.3].~A() (Implicit destructor) 368 // CHECK-NEXT: 2: CFGScopeEnd(c) 369 // CHECK-NEXT: 3: [B10.5].~A() (Implicit destructor) 370 // CHECK-NEXT: 4: CFGScopeEnd(b) 371 // CHECK-NEXT: T: continue; 372 // CHECK-NEXT: Preds (1): B7 373 // CHECK-NEXT: Succs (1): B2 374 // CHECK: [B7] 375 // CHECK-NEXT: 1: UV 376 // CHECK-NEXT: 2: [B7.1] (ImplicitCastExpr, LValueToRValue, _Bool) 377 // CHECK-NEXT: T: if [B7.2] 378 // CHECK-NEXT: Preds (1): B9 379 // CHECK-NEXT: Succs (2): B6 B5 380 // CHECK: [B8] 381 // CHECK-NEXT: 1: [B9.3].~A() (Implicit destructor) 382 // CHECK-NEXT: 2: CFGScopeEnd(c) 383 // CHECK-NEXT: T: break; 384 // CHECK-NEXT: Preds (1): B9 385 // CHECK-NEXT: Succs (1): B1 386 // CHECK: [B9] 387 // CHECK-NEXT: 1: CFGScopeBegin(c) 388 // CHECK-NEXT: 2: (CXXConstructExpr, [B9.3], A) 389 // CHECK-NEXT: 3: A c; 390 // CHECK-NEXT: 4: UV 391 // CHECK-NEXT: 5: [B9.4] (ImplicitCastExpr, LValueToRValue, _Bool) 392 // CHECK-NEXT: T: if [B9.5] 393 // CHECK-NEXT: Preds (1): B10 394 // CHECK-NEXT: Succs (2): B8 B7 395 // CHECK: [B10] 396 // CHECK-NEXT: 1: CFGScopeBegin(b) 397 // CHECK-NEXT: 2: a 398 // CHECK-NEXT: 3: [B10.2] (ImplicitCastExpr, NoOp, const A) 399 // CHECK-NEXT: 4: [B10.3] (CXXConstructExpr, [B10.5], A) 400 // CHECK-NEXT: 5: A b = a; 401 // CHECK-NEXT: 6: b 402 // CHECK-NEXT: 7: [B10.6] (ImplicitCastExpr, NoOp, const class A) 403 // CHECK-NEXT: 8: [B10.7].operator int 404 // CHECK-NEXT: 9: [B10.7] 405 // CHECK-NEXT: 10: [B10.9] (ImplicitCastExpr, UserDefinedConversion, int) 406 // CHECK-NEXT: 11: [B10.10] (ImplicitCastExpr, IntegralToBoolean, _Bool) 407 // CHECK-NEXT: T: while [B10.11] 408 // CHECK-NEXT: Preds (2): B2 B11 409 // CHECK-NEXT: Succs (2): B9 B1 410 // CHECK: [B11] 411 // CHECK-NEXT: 1: CFGScopeBegin(a) 412 // CHECK-NEXT: 2: (CXXConstructExpr, [B11.3], A) 413 // CHECK-NEXT: 3: A a; 414 // CHECK-NEXT: Preds (1): B12 415 // CHECK-NEXT: Succs (1): B10 416 // CHECK: [B0 (EXIT)] 417 // CHECK-NEXT: Preds (2): B1 B4 418 void test_while_jumps() { 419 A a; 420 while (A b = a) { 421 A c; 422 if (UV) break; 423 if (UV) continue; 424 if (UV) return; 425 A d; 426 } 427 A e; 428 } 429 430 // CHECK: [B12 (ENTRY)] 431 // CHECK-NEXT: Succs (1): B11 432 // CHECK: [B1] 433 // CHECK-NEXT: 1: (CXXConstructExpr, [B1.2], A) 434 // CHECK-NEXT: 2: A d; 435 // CHECK-NEXT: 3: [B1.2].~A() (Implicit destructor) 436 // CHECK-NEXT: 4: [B11.3].~A() (Implicit destructor) 437 // CHECK-NEXT: 5: CFGScopeEnd(a) 438 // CHECK-NEXT: Preds (2): B8 B2 439 // CHECK-NEXT: Succs (1): B0 440 // CHECK: [B2] 441 // CHECK-NEXT: 1: UV 442 // CHECK-NEXT: 2: [B2.1] (ImplicitCastExpr, LValueToRValue, _Bool) 443 // CHECK-NEXT: T: do ... while [B2.2] 444 // CHECK-NEXT: Preds (2): B3 B6 445 // CHECK-NEXT: Succs (2): B10 B1 446 // CHECK: [B3] 447 // CHECK-NEXT: 1: (CXXConstructExpr, [B3.2], A) 448 // CHECK-NEXT: 2: A c; 449 // CHECK-NEXT: 3: [B3.2].~A() (Implicit destructor) 450 // CHECK-NEXT: 4: [B9.3].~A() (Implicit destructor) 451 // CHECK-NEXT: 5: CFGScopeEnd(b) 452 // CHECK-NEXT: Preds (1): B5 453 // CHECK-NEXT: Succs (1): B2 454 // CHECK: [B4] 455 // CHECK-NEXT: 1: return; 456 // CHECK-NEXT: 2: [B9.3].~A() (Implicit destructor) 457 // CHECK-NEXT: 3: CFGScopeEnd(b) 458 // CHECK-NEXT: 4: [B11.3].~A() (Implicit destructor) 459 // CHECK-NEXT: 5: CFGScopeEnd(a) 460 // CHECK-NEXT: Preds (1): B5 461 // CHECK-NEXT: Succs (1): B0 462 // CHECK: [B5] 463 // CHECK-NEXT: 1: UV 464 // CHECK-NEXT: 2: [B5.1] (ImplicitCastExpr, LValueToRValue, _Bool) 465 // CHECK-NEXT: T: if [B5.2] 466 // CHECK-NEXT: Preds (1): B7 467 // CHECK-NEXT: Succs (2): B4 B3 468 // CHECK: [B6] 469 // CHECK-NEXT: 1: [B9.3].~A() (Implicit destructor) 470 // CHECK-NEXT: 2: CFGScopeEnd(b) 471 // CHECK-NEXT: T: continue; 472 // CHECK-NEXT: Preds (1): B7 473 // CHECK-NEXT: Succs (1): B2 474 // CHECK: [B7] 475 // CHECK-NEXT: 1: UV 476 // CHECK-NEXT: 2: [B7.1] (ImplicitCastExpr, LValueToRValue, _Bool) 477 // CHECK-NEXT: T: if [B7.2] 478 // CHECK-NEXT: Preds (1): B9 479 // CHECK-NEXT: Succs (2): B6 B5 480 // CHECK: [B8] 481 // CHECK-NEXT: 1: [B9.3].~A() (Implicit destructor) 482 // CHECK-NEXT: 2: CFGScopeEnd(b) 483 // CHECK-NEXT: T: break; 484 // CHECK-NEXT: Preds (1): B9 485 // CHECK-NEXT: Succs (1): B1 486 // CHECK: [B9] 487 // CHECK-NEXT: 1: CFGScopeBegin(b) 488 // CHECK-NEXT: 2: (CXXConstructExpr, [B9.3], A) 489 // CHECK-NEXT: 3: A b; 490 // CHECK-NEXT: 4: UV 491 // CHECK-NEXT: 5: [B9.4] (ImplicitCastExpr, LValueToRValue, _Bool) 492 // CHECK-NEXT: T: if [B9.5] 493 // CHECK-NEXT: Preds (2): B10 B11 494 // CHECK-NEXT: Succs (2): B8 B7 495 // CHECK: [B10] 496 // CHECK-NEXT: Preds (1): B2 497 // CHECK-NEXT: Succs (1): B9 498 // CHECK: [B11] 499 // CHECK-NEXT: 1: CFGScopeBegin(a) 500 // CHECK-NEXT: 2: (CXXConstructExpr, [B11.3], A) 501 // CHECK-NEXT: 3: A a; 502 // CHECK-NEXT: Preds (1): B12 503 // CHECK-NEXT: Succs (1): B9 504 // CHECK: [B0 (EXIT)] 505 // CHECK-NEXT: Preds (2): B1 B4 506 void test_do_jumps() { 507 A a; 508 do { 509 A b; 510 if (UV) break; 511 if (UV) continue; 512 if (UV) return; 513 A c; 514 } while (UV); 515 A d; 516 } 517 518 // CHECK: [B6 (ENTRY)] 519 // CHECK-NEXT: Succs (1): B5 520 // CHECK: [B1] 521 // CHECK-NEXT: 1: [B4.5].~A() (Implicit destructor) 522 // CHECK-NEXT: 2: CFGScopeEnd(b) 523 // CHECK-NEXT: 3: [B5.3].~A() (Implicit destructor) 524 // CHECK-NEXT: 4: CFGScopeEnd(a) 525 // CHECK-NEXT: Preds (1): B4 526 // CHECK-NEXT: Succs (1): B0 527 // CHECK: [B2] 528 // CHECK-NEXT: 1: b 529 // CHECK-NEXT: 2: [B2.1].p 530 // CHECK-NEXT: 3: [B4.5].~A() (Implicit destructor) 531 // CHECK-NEXT: 4: CFGScopeEnd(b) 532 // CHECK-NEXT: Preds (1): B3 533 // CHECK-NEXT: Succs (1): B4 534 // CHECK: [B3] 535 // CHECK-NEXT: 1: CFGScopeBegin(c) 536 // CHECK-NEXT: 2: (CXXConstructExpr, [B3.3], A) 537 // CHECK-NEXT: 3: A c; 538 // CHECK-NEXT: 4: [B3.3].~A() (Implicit destructor) 539 // CHECK-NEXT: 5: CFGScopeEnd(c) 540 // CHECK-NEXT: Preds (1): B4 541 // CHECK-NEXT: Succs (1): B2 542 // CHECK: [B4] 543 // CHECK-NEXT: 1: CFGScopeBegin(b) 544 // CHECK-NEXT: 2: a 545 // CHECK-NEXT: 3: [B4.2] (ImplicitCastExpr, NoOp, const A) 546 // CHECK-NEXT: 4: [B4.3] (CXXConstructExpr, [B4.5], A) 547 // CHECK-NEXT: 5: A b = a; 548 // CHECK-NEXT: 6: b 549 // CHECK-NEXT: 7: [B4.6] (ImplicitCastExpr, NoOp, const class A) 550 // CHECK-NEXT: 8: [B4.7].operator int 551 // CHECK-NEXT: 9: [B4.7] 552 // CHECK-NEXT: 10: [B4.9] (ImplicitCastExpr, UserDefinedConversion, int) 553 // CHECK-NEXT: 11: [B4.10] (ImplicitCastExpr, IntegralToBoolean, _Bool) 554 // CHECK-NEXT: T: for (...; [B4.11]; ...) 555 // CHECK-NEXT: Preds (2): B2 B5 556 // CHECK-NEXT: Succs (2): B3 B1 557 // CHECK: [B5] 558 // CHECK-NEXT: 1: CFGScopeBegin(a) 559 // CHECK-NEXT: 2: (CXXConstructExpr, [B5.3], A) 560 // CHECK-NEXT: 3: A a; 561 // CHECK-NEXT: Preds (1): B6 562 // CHECK-NEXT: Succs (1): B4 563 // CHECK: [B0 (EXIT)] 564 // CHECK-NEXT: Preds (1): B1 565 void test_for_implicit_scope() { 566 for (A a; A b = a; b.p) 567 A c; 568 } 569 570 // CHECK: [B12 (ENTRY)] 571 // CHECK-NEXT: Succs (1): B11 572 // CHECK: [B1] 573 // CHECK-NEXT: 1: [B10.5].~A() (Implicit destructor) 574 // CHECK-NEXT: 2: CFGScopeEnd(c) 575 // CHECK-NEXT: 3: [B11.6].~A() (Implicit destructor) 576 // CHECK-NEXT: 4: CFGScopeEnd(b) 577 // CHECK-NEXT: 5: (CXXConstructExpr, [B1.6], A) 578 // CHECK-NEXT: 6: A f; 579 // CHECK-NEXT: 7: [B1.6].~A() (Implicit destructor) 580 // CHECK-NEXT: 8: [B11.3].~A() (Implicit destructor) 581 // CHECK-NEXT: 9: CFGScopeEnd(a) 582 // CHECK-NEXT: Preds (2): B8 B10 583 // CHECK-NEXT: Succs (1): B0 584 // CHECK: [B2] 585 // CHECK-NEXT: 1: [B10.5].~A() (Implicit destructor) 586 // CHECK-NEXT: 2: CFGScopeEnd(c) 587 // CHECK-NEXT: Preds (2): B3 B6 588 // CHECK-NEXT: Succs (1): B10 589 // CHECK: [B3] 590 // CHECK-NEXT: 1: (CXXConstructExpr, [B3.2], A) 591 // CHECK-NEXT: 2: A e; 592 // CHECK-NEXT: 3: [B3.2].~A() (Implicit destructor) 593 // CHECK-NEXT: 4: [B9.3].~A() (Implicit destructor) 594 // CHECK-NEXT: 5: CFGScopeEnd(d) 595 // CHECK-NEXT: Preds (1): B5 596 // CHECK-NEXT: Succs (1): B2 597 // CHECK: [B4] 598 // CHECK-NEXT: 1: return; 599 // CHECK-NEXT: 2: [B9.3].~A() (Implicit destructor) 600 // CHECK-NEXT: 3: CFGScopeEnd(d) 601 // CHECK-NEXT: 4: [B10.5].~A() (Implicit destructor) 602 // CHECK-NEXT: 5: CFGScopeEnd(c) 603 // CHECK-NEXT: 6: [B11.6].~A() (Implicit destructor) 604 // CHECK-NEXT: 7: CFGScopeEnd(b) 605 // CHECK-NEXT: 8: [B11.3].~A() (Implicit destructor) 606 // CHECK-NEXT: 9: CFGScopeEnd(a) 607 // CHECK-NEXT: Preds (1): B5 608 // CHECK-NEXT: Succs (1): B0 609 // CHECK: [B5] 610 // CHECK-NEXT: 1: UV 611 // CHECK-NEXT: 2: [B5.1] (ImplicitCastExpr, LValueToRValue, _Bool) 612 // CHECK-NEXT: T: if [B5.2] 613 // CHECK-NEXT: Preds (1): B7 614 // CHECK-NEXT: Succs (2): B4 B3 615 // CHECK: [B6] 616 // CHECK-NEXT: 1: [B9.3].~A() (Implicit destructor) 617 // CHECK-NEXT: 2: CFGScopeEnd(d) 618 // CHECK-NEXT: T: continue; 619 // CHECK-NEXT: Preds (1): B7 620 // CHECK-NEXT: Succs (1): B2 621 // CHECK: [B7] 622 // CHECK-NEXT: 1: UV 623 // CHECK-NEXT: 2: [B7.1] (ImplicitCastExpr, LValueToRValue, _Bool) 624 // CHECK-NEXT: T: if [B7.2] 625 // CHECK-NEXT: Preds (1): B9 626 // CHECK-NEXT: Succs (2): B6 B5 627 // CHECK: [B8] 628 // CHECK-NEXT: 1: [B9.3].~A() (Implicit destructor) 629 // CHECK-NEXT: 2: CFGScopeEnd(d) 630 // CHECK-NEXT: T: break; 631 // CHECK-NEXT: Preds (1): B9 632 // CHECK-NEXT: Succs (1): B1 633 // CHECK: [B9] 634 // CHECK-NEXT: 1: CFGScopeBegin(d) 635 // CHECK-NEXT: 2: (CXXConstructExpr, [B9.3], A) 636 // CHECK-NEXT: 3: A d; 637 // CHECK-NEXT: 4: UV 638 // CHECK-NEXT: 5: [B9.4] (ImplicitCastExpr, LValueToRValue, _Bool) 639 // CHECK-NEXT: T: if [B9.5] 640 // CHECK-NEXT: Preds (1): B10 641 // CHECK-NEXT: Succs (2): B8 B7 642 // CHECK: [B10] 643 // CHECK-NEXT: 1: CFGScopeBegin(c) 644 // CHECK-NEXT: 2: b 645 // CHECK-NEXT: 3: [B10.2] (ImplicitCastExpr, NoOp, const A) 646 // CHECK-NEXT: 4: [B10.3] (CXXConstructExpr, [B10.5], A) 647 // CHECK-NEXT: 5: A c = b; 648 // CHECK-NEXT: 6: c 649 // CHECK-NEXT: 7: [B10.6] (ImplicitCastExpr, NoOp, const class A) 650 // CHECK-NEXT: 8: [B10.7].operator int 651 // CHECK-NEXT: 9: [B10.7] 652 // CHECK-NEXT: 10: [B10.9] (ImplicitCastExpr, UserDefinedConversion, int) 653 // CHECK-NEXT: 11: [B10.10] (ImplicitCastExpr, IntegralToBoolean, _Bool) 654 // CHECK-NEXT: T: for (...; [B10.11]; ) 655 // CHECK-NEXT: Preds (2): B2 B11 656 // CHECK-NEXT: Succs (2): B9 B1 657 // CHECK: [B11] 658 // CHECK-NEXT: 1: CFGScopeBegin(a) 659 // CHECK-NEXT: 2: (CXXConstructExpr, [B11.3], A) 660 // CHECK-NEXT: 3: A a; 661 // CHECK-NEXT: 4: CFGScopeBegin(b) 662 // CHECK-NEXT: 5: (CXXConstructExpr, [B11.6], A) 663 // CHECK-NEXT: 6: A b; 664 // CHECK-NEXT: Preds (1): B12 665 // CHECK-NEXT: Succs (1): B10 666 // CHECK: [B0 (EXIT)] 667 // CHECK-NEXT: Preds (2): B1 B4 668 void test_for_jumps() { 669 A a; 670 for (A b; A c = b; ) { 671 A d; 672 if (UV) break; 673 if (UV) continue; 674 if (UV) return; 675 A e; 676 } 677 A f; 678 } 679 680 // CHECK: [B9 (ENTRY)] 681 // CHECK-NEXT: Succs (1): B8 682 // CHECK: [B1] 683 // CHECK-NEXT: 1: [B7.5].~A() (Implicit destructor) 684 // CHECK-NEXT: 2: CFGScopeEnd(b) 685 // CHECK-NEXT: 3: [B8.3].~A() (Implicit destructor) 686 // CHECK-NEXT: 4: CFGScopeEnd(a) 687 // CHECK-NEXT: Preds (1): B7 688 // CHECK-NEXT: Succs (1): B0 689 // CHECK: [B2] 690 // CHECK-NEXT: 1: [B5.4] ? [B3.3] : [B4.2] 691 // CHECK-NEXT: 2: [B7.5].~A() (Implicit destructor) 692 // CHECK-NEXT: 3: CFGScopeEnd(b) 693 // CHECK-NEXT: Preds (2): B3 B4 694 // CHECK-NEXT: Succs (1): B7 695 // CHECK: [B3] 696 // CHECK-NEXT: 1: b 697 // CHECK-NEXT: 2: [B3.1].p 698 // CHECK-NEXT: 3: [B3.2]++ 699 // CHECK-NEXT: Preds (1): B5 700 // CHECK-NEXT: Succs (1): B2 701 // CHECK: [B4] 702 // CHECK-NEXT: 1: 0 703 // CHECK-NEXT: 2: [B4.1] (ImplicitCastExpr, NullToPointer, int *) 704 // CHECK-NEXT: Preds (1): B5 705 // CHECK-NEXT: Succs (1): B2 706 // CHECK: [B5] 707 // CHECK-NEXT: 1: b 708 // CHECK-NEXT: 2: [B5.1].p 709 // CHECK-NEXT: 3: [B5.2] (ImplicitCastExpr, LValueToRValue, int *) 710 // CHECK-NEXT: 4: [B5.3] (ImplicitCastExpr, PointerToBoolean, _Bool) 711 // CHECK-NEXT: T: [B5.4] ? ... : ... 712 // CHECK-NEXT: Preds (1): B6 713 // CHECK-NEXT: Succs (2): B3 B4 714 // CHECK: [B6] 715 // CHECK-NEXT: 1: 0 716 // CHECK-NEXT: 2: (void)[B6.1] (CStyleCastExpr, ToVoid, void) 717 // CHECK-NEXT: Preds (1): B7 718 // CHECK-NEXT: Succs (1): B5 719 // CHECK: [B7] 720 // CHECK-NEXT: 1: CFGScopeBegin(b) 721 // CHECK-NEXT: 2: a 722 // CHECK-NEXT: 3: [B7.2] (ImplicitCastExpr, NoOp, const A) 723 // CHECK-NEXT: 4: [B7.3] (CXXConstructExpr, [B7.5], A) 724 // CHECK-NEXT: 5: A b = a; 725 // CHECK-NEXT: 6: b 726 // CHECK-NEXT: 7: [B7.6] (ImplicitCastExpr, NoOp, const class A) 727 // CHECK-NEXT: 8: [B7.7].operator int 728 // CHECK-NEXT: 9: [B7.7] 729 // CHECK-NEXT: 10: [B7.9] (ImplicitCastExpr, UserDefinedConversion, int) 730 // CHECK-NEXT: 11: [B7.10] (ImplicitCastExpr, IntegralToBoolean, _Bool) 731 // CHECK-NEXT: T: for (...; [B7.11]; ...) 732 // CHECK-NEXT: Preds (2): B2 B8 733 // CHECK-NEXT: Succs (2): B6 B1 734 // CHECK: [B8] 735 // CHECK-NEXT: 1: CFGScopeBegin(a) 736 // CHECK-NEXT: 2: (CXXConstructExpr, [B8.3], A) 737 // CHECK-NEXT: 3: A a; 738 // CHECK-NEXT: Preds (1): B9 739 // CHECK-NEXT: Succs (1): B7 740 void test_for_inc_conditional() { 741 for (A a; A b = a; b.p ? b.p++ : 0) 742 (void)0; 743 } 744 745 // CHECK: [B9 (ENTRY)] 746 // CHECK-NEXT: Succs (1): B7 747 // CHECK: [B1] 748 // CHECK-NEXT: l1: 749 // CHECK-NEXT: 1: (CXXConstructExpr, [B1.2], A) 750 // CHECK-NEXT: 2: A c; 751 // CHECK-NEXT: 3: [B1.2].~A() (Implicit destructor) 752 // CHECK-NEXT: 4: [B6.4].~A() (Implicit destructor) 753 // CHECK-NEXT: 5: [B6.2].~A() (Implicit destructor) 754 // CHECK-NEXT: 6: [B7.3].~A() (Implicit destructor) 755 // CHECK-NEXT: 7: CFGScopeEnd(a) 756 // CHECK-NEXT: Preds (2): B2 B3 757 // CHECK-NEXT: Succs (1): B0 758 // CHECK: [B2] 759 // CHECK-NEXT: 1: (CXXConstructExpr, [B2.2], A) 760 // CHECK-NEXT: 2: A nb; 761 // CHECK-NEXT: 3: [B2.2].~A() (Implicit destructor) 762 // CHECK-NEXT: 4: [B6.7].~A() (Implicit destructor) 763 // CHECK-NEXT: 5: CFGScopeEnd(na) 764 // CHECK-NEXT: Preds (1): B4 765 // CHECK-NEXT: Succs (1): B1 766 // CHECK: [B3] 767 // CHECK-NEXT: 1: [B6.7].~A() (Implicit destructor) 768 // CHECK-NEXT: 2: CFGScopeEnd(na) 769 // CHECK-NEXT: T: goto l1; 770 // CHECK-NEXT: Preds (1): B4 771 // CHECK-NEXT: Succs (1): B1 772 // CHECK: [B4] 773 // CHECK-NEXT: 1: UV 774 // CHECK-NEXT: 2: [B4.1] (ImplicitCastExpr, LValueToRValue, _Bool) 775 // CHECK-NEXT: T: if [B4.2] 776 // CHECK-NEXT: Preds (1): B6 777 // CHECK-NEXT: Succs (2): B3 B2 778 // CHECK: [B5] 779 // CHECK-NEXT: Preds (1): B6 780 // CHECK-NEXT: Succs (1): B8 781 // CHECK: [B6] 782 // CHECK-NEXT: l0: 783 // CHECK-NEXT: 1: (CXXConstructExpr, [B6.2], A) 784 // CHECK-NEXT: 2: A cb; 785 // CHECK-NEXT: 3: (CXXConstructExpr, [B6.4], A) 786 // CHECK-NEXT: 4: A b; 787 // CHECK-NEXT: 5: CFGScopeBegin(na) 788 // CHECK-NEXT: 6: (CXXConstructExpr, [B6.7], A) 789 // CHECK-NEXT: 7: A na; 790 // CHECK-NEXT: 8: UV 791 // CHECK-NEXT: 9: [B6.8] (ImplicitCastExpr, LValueToRValue, _Bool) 792 // CHECK-NEXT: T: if [B6.9] 793 // CHECK-NEXT: Preds (2): B7 B8 794 // CHECK-NEXT: Succs (2): B5 B4 795 // CHECK: [B7] 796 // CHECK-NEXT: 1: CFGScopeBegin(a) 797 // CHECK-NEXT: 2: (CXXConstructExpr, [B7.3], A) 798 // CHECK-NEXT: 3: A a; 799 // CHECK-NEXT: Preds (1): B9 800 // CHECK-NEXT: Succs (1): B6 801 // CHECK: [B8] 802 // CHECK-NEXT: 1: [B6.7].~A() (Implicit destructor) 803 // CHECK-NEXT: 2: CFGScopeEnd(na) 804 // CHECK-NEXT: 3: [B6.4].~A() (Implicit destructor) 805 // CHECK-NEXT: 4: [B6.2].~A() (Implicit destructor) 806 // CHECK-NEXT: T: goto l0; 807 // CHECK-NEXT: Preds (1): B5 808 // CHECK-NEXT: Succs (1): B6 809 // CHECK: [B0 (EXIT)] 810 // CHECK-NEXT: Preds (1): B1 811 void test_goto() { 812 A a; 813 l0: 814 A cb; 815 A b; 816 { A na; 817 if (UV) goto l0; 818 if (UV) goto l1; 819 A nb; 820 } 821 l1: 822 A c; 823 } 824 825 // CHECK: [B7 (ENTRY)] 826 // CHECK-NEXT: Succs (1): B6 827 // CHECK: [B1] 828 // CHECK-NEXT: 1: CFGScopeEnd(i) 829 // CHECK-NEXT: 2: CFGScopeBegin(unused2) 830 // CHECK-NEXT: 3: int unused2; 831 // CHECK-NEXT: 4: CFGScopeEnd(unused2) 832 // CHECK-NEXT: Preds (2): B4 B5 833 // CHECK-NEXT: Succs (1): B0 834 // CHECK: [B2] 835 // CHECK-NEXT: 1: i 836 // CHECK-NEXT: 2: ++[B2.1] 837 // CHECK-NEXT: Preds (1): B3 838 // CHECK-NEXT: Succs (1): B5 839 // CHECK: [B3] 840 // CHECK-NEXT: 1: CFGScopeEnd(unused1) 841 // CHECK-NEXT: Succs (1): B2 842 // CHECK: [B4] 843 // CHECK-NEXT: 1: CFGScopeBegin(unused1) 844 // CHECK-NEXT: 2: int unused1; 845 // CHECK-NEXT: 3: CFGScopeEnd(unused1) 846 // CHECK-NEXT: T: break; 847 // CHECK-NEXT: Preds (1): B5 848 // CHECK-NEXT: Succs (1): B1 849 // CHECK: [B5] 850 // CHECK-NEXT: 1: i 851 // CHECK-NEXT: 2: [B5.1] (ImplicitCastExpr, LValueToRValue, int) 852 // CHECK-NEXT: 3: 3 853 // CHECK-NEXT: 4: [B5.2] < [B5.3] 854 // CHECK-NEXT: T: for (...; [B5.4]; ...) 855 // CHECK-NEXT: Preds (2): B2 B6 856 // CHECK-NEXT: Succs (2): B4 B1 857 // CHECK: [B6] 858 // CHECK-NEXT: 1: CFGScopeBegin(i) 859 // CHECK-NEXT: 2: 0 860 // CHECK-NEXT: 3: int i = 0; 861 // CHECK-NEXT: Preds (1): B7 862 // CHECK-NEXT: Succs (1): B5 863 // CHECK: [B0 (EXIT)] 864 // CHECK-NEXT: Preds (1): B1 865 void test_for_compound_and_break() { 866 for (int i = 0; i < 3; ++i) { 867 { 868 int unused1; 869 break; 870 } 871 } 872 { 873 int unused2; 874 } 875 } 876 877 // CHECK: [B6 (ENTRY)] 878 // CHECK-NEXT: Succs (1): B5 879 // CHECK: [B1] 880 // CHECK-NEXT: 1: CFGScopeEnd(__end1) 881 // CHECK-NEXT: 2: CFGScopeEnd(__begin1) 882 // CHECK-NEXT: 3: CFGScopeEnd(__range1) 883 // CHECK-NEXT: 4: [B5.3].~A[10]() (Implicit destructor) 884 // CHECK-NEXT: 5: CFGScopeEnd(a) 885 // CHECK-NEXT: Preds (1): B2 886 // CHECK-NEXT: Succs (1): B0 887 // CHECK: [B2] 888 // CHECK-NEXT: 1: __begin1 889 // CHECK-NEXT: 2: [B2.1] (ImplicitCastExpr, LValueToRValue, A *) 890 // CHECK-NEXT: 3: __end1 891 // CHECK-NEXT: 4: [B2.3] (ImplicitCastExpr, LValueToRValue, A *) 892 // CHECK-NEXT: 5: [B2.2] != [B2.4] 893 // CHECK-NEXT: T: for (auto &i : [B5.4]) 894 // CHECK: [B4.11]; 895 // CHECK: Preds (2): B3 B5 896 // CHECK-NEXT: Succs (2): B4 B1 897 // CHECK: [B3] 898 // CHECK-NEXT: 1: __begin1 899 // CHECK-NEXT: 2: ++[B3.1] 900 // CHECK-NEXT: Preds (1): B4 901 // CHECK-NEXT: Succs (1): B2 902 // CHECK: [B4] 903 // CHECK-NEXT: 1: CFGScopeBegin(i) 904 // CHECK-NEXT: 2: __begin1 905 // CHECK-NEXT: 3: [B4.2] (ImplicitCastExpr, LValueToRValue, A *) 906 // CHECK-NEXT: 4: *[B4.3] 907 // CHECK-NEXT: 5: auto &i 908 // CHECK-NEXT: 6: operator= 909 // CHECK-NEXT: 7: [B4.6] (ImplicitCastExpr, FunctionToPointerDecay, A &(*)(const A &) 910 // CHECK-NEXT: 8: i 911 // CHECK-NEXT: 9: b 912 // CHECK-NEXT: 10: [B4.9] (ImplicitCastExpr, NoOp, const A) 913 // CHECK-NEXT: 11: [B4.8] = [B4.10] (OperatorCall) 914 // CHECK-NEXT: 12: CFGScopeEnd(i) 915 // CHECK-NEXT: Preds (1): B2 916 // CHECK-NEXT: Succs (1): B3 917 // CHECK: [B5] 918 // CHECK-NEXT: 1: CFGScopeBegin(a) 919 // CHECK-NEXT: 2: (CXXConstructExpr, [B5.3], A[10]) 920 // CHECK-NEXT: 3: A a[10]; 921 // CHECK-NEXT: 4: a 922 // CHECK-NEXT: 5: auto &&__range1 = a; 923 // CHECK-NEXT: 6: CFGScopeBegin(__end1) 924 // CHECK-NEXT: 7: __range1 925 // CHECK-NEXT: 8: [B5.7] (ImplicitCastExpr, ArrayToPointerDecay, A *) 926 // CHECK-NEXT: 9: 10 927 // CHECK-NEXT: 10: [B5.8] + [B5.9] 928 // CHECK-NEXT: 11: auto __end1 = __range1 + 10 929 // CHECK-NEXT: 12: __range1 930 // CHECK-NEXT: 13: [B5.12] (ImplicitCastExpr, ArrayToPointerDecay, A *) 931 // CHECK-NEXT: 14: auto __begin1 = __range1; 932 // CHECK-NEXT: Preds (1): B6 933 // CHECK-NEXT: Succs (1): B2 934 // CHECK: [B0 (EXIT)] 935 // CHECK-NEXT: Preds (1): B1 936 void test_range_for(A &b) { 937 A a[10]; 938 for (auto &i : a) 939 i = b; 940 } 941 942 // CHECK: [B8 (ENTRY)] 943 // CHECK-NEXT: Succs (1): B2 944 // CHECK: [B1] 945 // CHECK-NEXT: 1: CFGScopeEnd(i) 946 // CHECK-NEXT: 2: 1 947 // CHECK-NEXT: 3: int k = 1; 948 // CHECK-NEXT: 4: CFGScopeEnd(c) 949 // CHECK-NEXT: Preds (3): B3 B5 B6 950 // CHECK-NEXT: Succs (1): B0 951 // CHECK: [B2] 952 // CHECK-NEXT: 1: CFGScopeBegin(c) 953 // CHECK-NEXT: 2: '1' 954 // CHECK-NEXT: 3: char c = '1'; 955 // CHECK-NEXT: 4: CFGScopeBegin(i) 956 // CHECK-NEXT: 5: getX 957 // CHECK-NEXT: 6: [B2.5] (ImplicitCastExpr, FunctionToPointerDecay, int (*)(void)) 958 // CHECK-NEXT: 7: [B2.6]() 959 // CHECK-NEXT: 8: int i = getX(); 960 // CHECK-NEXT: 9: i 961 // CHECK-NEXT: 10: [B2.9] (ImplicitCastExpr, LValueToRValue, int) 962 // CHECK-NEXT: T: switch [B2.10] 963 // CHECK-NEXT: Preds (1): B8 964 // CHECK-NEXT: Succs (5): B4 B5 B6 B7 B3 965 // CHECK: [B3] 966 // CHECK-NEXT: default: 967 // CHECK-NEXT: 1: CFGScopeBegin(a) 968 // CHECK-NEXT: 2: 0 969 // CHECK-NEXT: 3: int a = 0; 970 // CHECK-NEXT: 4: i 971 // CHECK-NEXT: 5: ++[B3.4] 972 // CHECK-NEXT: 6: CFGScopeEnd(a) 973 // CHECK-NEXT: Preds (2): B4 B2 974 // CHECK-NEXT: Succs (1): B1 975 // CHECK: [B4] 976 // CHECK-NEXT: case 3: 977 // CHECK-NEXT: 1: '2' 978 // CHECK-NEXT: 2: c 979 // CHECK-NEXT: 3: [B4.2] = [B4.1] 980 // CHECK-NEXT: Preds (1): B2 981 // CHECK-NEXT: Succs (1): B3 982 // CHECK: [B5] 983 // CHECK-NEXT: case 2: 984 // CHECK-NEXT: 1: '2' 985 // CHECK-NEXT: 2: c 986 // CHECK-NEXT: 3: [B5.2] = [B5.1] 987 // CHECK-NEXT: T: break; 988 // CHECK-NEXT: Preds (1): B2 989 // CHECK-NEXT: Succs (1): B1 990 // CHECK: [B6] 991 // CHECK-NEXT: case 1: 992 // CHECK-NEXT: 1: '3' 993 // CHECK-NEXT: 2: c 994 // CHECK-NEXT: 3: [B6.2] = [B6.1] 995 // CHECK-NEXT: T: break; 996 // CHECK-NEXT: Preds (2): B2 B7 997 // CHECK-NEXT: Succs (1): B1 998 // CHECK: [B7] 999 // CHECK-NEXT: case 0: 1000 // CHECK-NEXT: 1: '2' 1001 // CHECK-NEXT: 2: c 1002 // CHECK-NEXT: 3: [B7.2] = [B7.1] 1003 // CHECK-NEXT: Preds (1): B2 1004 // CHECK-NEXT: Succs (1): B6 1005 // CHECK: [B0 (EXIT)] 1006 // CHECK-NEXT: Preds (1): B1 1007 void test_switch_with_compound_with_default() { 1008 char c = '1'; 1009 switch (int i = getX()) { 1010 case 0: 1011 c = '2'; 1012 case 1: 1013 c = '3'; 1014 break; 1015 case 2: { 1016 c = '2'; 1017 break; 1018 } 1019 case 3: 1020 c = '2'; 1021 default: { 1022 int a = 0; 1023 ++i; 1024 } 1025 } 1026 int k = 1; 1027 } 1028 1029 // CHECK: [B6 (ENTRY)] 1030 // CHECK-NEXT: Succs (1): B2 1031 // CHECK: [B1] 1032 // CHECK-NEXT: 1: CFGScopeEnd(i) 1033 // CHECK-NEXT: 2: 3 1034 // CHECK-NEXT: 3: int k = 3; 1035 // CHECK-NEXT: 4: CFGScopeEnd(c) 1036 // CHECK-NEXT: Preds (3): B3 B4 B2 1037 // CHECK-NEXT: Succs (1): B0 1038 // CHECK: [B2] 1039 // CHECK-NEXT: 1: CFGScopeBegin(c) 1040 // CHECK-NEXT: 2: '1' 1041 // CHECK-NEXT: 3: char c = '1'; 1042 // CHECK-NEXT: 4: CFGScopeBegin(i) 1043 // CHECK-NEXT: 5: getX 1044 // CHECK-NEXT: 6: [B2.5] (ImplicitCastExpr, FunctionToPointerDecay, int (*)(void)) 1045 // CHECK-NEXT: 7: [B2.6]() 1046 // CHECK-NEXT: 8: int i = getX(); 1047 // CHECK-NEXT: 9: i 1048 // CHECK-NEXT: 10: [B2.9] (ImplicitCastExpr, LValueToRValue, int) 1049 // CHECK-NEXT: T: switch [B2.10] 1050 // CHECK-NEXT: Preds (1): B6 1051 // CHECK-NEXT: Succs (4): B3 B4 B5 B1 1052 // CHECK: [B3] 1053 // CHECK-NEXT: case 2: 1054 // CHECK-NEXT: 1: '3' 1055 // CHECK-NEXT: 2: c 1056 // CHECK-NEXT: 3: [B3.2] = [B3.1] 1057 // CHECK-NEXT: T: break; 1058 // CHECK-NEXT: Preds (1): B2 1059 // CHECK-NEXT: Succs (1): B1 1060 // CHECK: [B4] 1061 // CHECK-NEXT: case 1: 1062 // CHECK-NEXT: 1: '1' 1063 // CHECK-NEXT: 2: c 1064 // CHECK-NEXT: 3: [B4.2] = [B4.1] 1065 // CHECK-NEXT: T: break; 1066 // CHECK-NEXT: Preds (2): B2 B5 1067 // CHECK-NEXT: Succs (1): B1 1068 // CHECK: [B5] 1069 // CHECK-NEXT: case 0: 1070 // CHECK-NEXT: 1: '2' 1071 // CHECK-NEXT: 2: c 1072 // CHECK-NEXT: 3: [B5.2] = [B5.1] 1073 // CHECK-NEXT: Preds (1): B2 1074 // CHECK-NEXT: Succs (1): B4 1075 // CHECK: [B0 (EXIT)] 1076 // CHECK-NEXT: Preds (1): B1 1077 void test_switch_with_compound_without_default() { 1078 char c = '1'; 1079 switch (int i = getX()) { 1080 case 0: 1081 c = '2'; 1082 case 1: 1083 c = '1'; 1084 break; 1085 case 2: 1086 c = '3'; 1087 break; 1088 } 1089 int k = 3; 1090 } 1091 1092 // CHECK: [B5 (ENTRY)] 1093 // CHECK-NEXT: Succs (1): B2 1094 // CHECK: [B1] 1095 // CHECK-NEXT: 1: CFGScopeEnd(i) 1096 // CHECK-NEXT: 2: 1 1097 // CHECK-NEXT: 3: int k = 1; 1098 // CHECK-NEXT: 4: CFGScopeEnd(s) 1099 // CHECK-NEXT: Preds (1): B3 1100 // CHECK-NEXT: Succs (1): B0 1101 // CHECK: [B2] 1102 // CHECK-NEXT: 1: CFGScopeBegin(s) 1103 // CHECK-NEXT: 2: '1' 1104 // CHECK-NEXT: 3: char s = '1'; 1105 // CHECK-NEXT: 4: CFGScopeBegin(i) 1106 // CHECK-NEXT: 5: getX 1107 // CHECK-NEXT: 6: [B2.5] (ImplicitCastExpr, FunctionToPointerDecay, int (*)(void)) 1108 // CHECK-NEXT: 7: [B2.6]() 1109 // CHECK-NEXT: 8: int i = getX(); 1110 // CHECK-NEXT: 9: i 1111 // CHECK-NEXT: 10: [B2.9] (ImplicitCastExpr, LValueToRValue, int) 1112 // CHECK-NEXT: T: switch [B2.10] 1113 // CHECK-NEXT: Preds (1): B5 1114 // CHECK-NEXT: Succs (2): B4 B3 1115 // CHECK: [B3] 1116 // CHECK-NEXT: default: 1117 // CHECK-NEXT: 1: CFGScopeBegin(a) 1118 // CHECK-NEXT: 2: 0 1119 // CHECK-NEXT: 3: int a = 0; 1120 // CHECK-NEXT: 4: i 1121 // CHECK-NEXT: 5: ++[B3.4] 1122 // CHECK-NEXT: 6: CFGScopeEnd(a) 1123 // CHECK-NEXT: Preds (2): B4 B2 1124 // CHECK-NEXT: Succs (1): B1 1125 // CHECK: [B4] 1126 // CHECK-NEXT: case 0: 1127 // CHECK-NEXT: Preds (1): B2 1128 // CHECK-NEXT: Succs (1): B3 1129 // CHECK: [B0 (EXIT)] 1130 // CHECK-NEXT: Preds (1): B1 1131 void test_without_compound() { 1132 char s = '1'; 1133 switch (int i = getX()) 1134 case 0: 1135 default: { 1136 int a = 0; 1137 ++i; 1138 } 1139 int k = 1; 1140 } 1141 1142 // CHECK: [B12 (ENTRY)] 1143 // CHECK-NEXT: Succs (1): B11 1144 // CHECK: [B1] 1145 // CHECK-NEXT: 1: CFGScopeEnd(i) 1146 // CHECK-NEXT: Preds (2): B4 B10 1147 // CHECK-NEXT: Succs (1): B0 1148 // CHECK: [B2] 1149 // CHECK-NEXT: 1: i 1150 // CHECK-NEXT: 2: ++[B2.1] 1151 // CHECK-NEXT: Preds (2): B3 B7 1152 // CHECK-NEXT: Succs (1): B10 1153 // CHECK: [B3] 1154 // CHECK-NEXT: 1: CFGScopeEnd(z) 1155 // CHECK-NEXT: Succs (1): B2 1156 // CHECK: [B4] 1157 // CHECK-NEXT: 1: CFGScopeBegin(z) 1158 // CHECK-NEXT: 2: 5 1159 // CHECK-NEXT: 3: int z = 5; 1160 // CHECK-NEXT: 4: CFGScopeEnd(z) 1161 // CHECK-NEXT: T: break; 1162 // CHECK-NEXT: Preds (2): B6 B8 1163 // CHECK-NEXT: Succs (1): B1 1164 // CHECK: [B5] 1165 // CHECK-NEXT: 1: x 1166 // CHECK-NEXT: 2: [B5.1] (ImplicitCastExpr, LValueToRValue, int) 1167 // CHECK-NEXT: T: switch [B5.2] 1168 // CHECK-NEXT: Preds (1): B10 1169 // CHECK-NEXT: Succs (4): B7 B8 B9 B6 1170 // CHECK: [B6] 1171 // CHECK-NEXT: default: 1172 // CHECK-NEXT: 1: 3 1173 // CHECK-NEXT: 2: y 1174 // CHECK-NEXT: 3: [B6.2] = [B6.1] 1175 // CHECK-NEXT: Preds (1): B5 1176 // CHECK-NEXT: Succs (1): B4 1177 // CHECK: [B7] 1178 // CHECK-NEXT: case 2: 1179 // CHECK-NEXT: 1: 4 1180 // CHECK-NEXT: 2: y 1181 // CHECK-NEXT: 3: [B7.2] = [B7.1] 1182 // CHECK-NEXT: T: continue; 1183 // CHECK-NEXT: Preds (1): B5 1184 // CHECK-NEXT: Succs (1): B2 1185 // CHECK: [B8] 1186 // CHECK-NEXT: case 1: 1187 // CHECK-NEXT: 1: 2 1188 // CHECK-NEXT: 2: y 1189 // CHECK-NEXT: 3: [B8.2] = [B8.1] 1190 // CHECK-NEXT: T: break; 1191 // CHECK-NEXT: Preds (2): B5 B9 1192 // CHECK-NEXT: Succs (1): B4 1193 // CHECK: [B9] 1194 // CHECK-NEXT: case 0: 1195 // CHECK-NEXT: 1: 1 1196 // CHECK-NEXT: 2: y 1197 // CHECK-NEXT: 3: [B9.2] = [B9.1] 1198 // CHECK-NEXT: Preds (1): B5 1199 // CHECK-NEXT: Succs (1): B8 1200 // CHECK: [B10] 1201 // CHECK-NEXT: 1: i 1202 // CHECK-NEXT: 2: [B10.1] (ImplicitCastExpr, LValueToRValue, int) 1203 // CHECK-NEXT: 3: 1000 1204 // CHECK-NEXT: 4: [B10.2] < [B10.3] 1205 // CHECK-NEXT: T: for (...; [B10.4]; ...) 1206 // CHECK-NEXT: Preds (2): B2 B11 1207 // CHECK-NEXT: Succs (2): B5 B1 1208 // CHECK: [B11] 1209 // CHECK-NEXT: 1: CFGScopeBegin(i) 1210 // CHECK-NEXT: 2: int i; 1211 // CHECK-NEXT: 3: int x; 1212 // CHECK-NEXT: 4: int y; 1213 // CHECK-NEXT: 5: 0 1214 // CHECK-NEXT: 6: i 1215 // CHECK-NEXT: 7: [B11.6] = [B11.5] 1216 // CHECK-NEXT: Preds (1): B12 1217 // CHECK-NEXT: Succs (1): B10 1218 // CHECK: [B0 (EXIT)] 1219 // CHECK-NEXT: Preds (1): B1 1220 void test_for_switch_in_for() { 1221 int i, x, y; 1222 for (i = 0; i < 1000; ++i) { 1223 switch (x) { 1224 case 0: 1225 y = 1; 1226 case 1: 1227 y = 2; 1228 break; // break from switch 1229 case 2: 1230 y = 4; 1231 continue; // continue in loop 1232 default: 1233 y = 3; 1234 } 1235 { 1236 int z = 5; 1237 break; // break from loop 1238 } 1239 } 1240 } 1241 1242 // CHECK: [B4 (ENTRY)] 1243 // CHECK-NEXT: Succs (1): B3 1244 // CHECK: [B1] 1245 // CHECK-NEXT: label: 1246 // CHECK-NEXT: 1: CFGScopeEnd(n2t) 1247 // CHECK-NEXT: 2: CFGScopeEnd(n1t) 1248 // CHECK-NEXT: 3: [B3.3].~A() (Implicit destructor) 1249 // CHECK-NEXT: 4: CFGScopeEnd(a) 1250 // CHECK-NEXT: Preds (2): B2 B3 1251 // CHECK-NEXT: Succs (1): B0 1252 // CHECK: [B2] 1253 // CHECK-NEXT: 1: [B3.9].~A() (Implicit destructor) 1254 // CHECK-NEXT: 2: CFGScopeEnd(n2s) 1255 // CHECK-NEXT: 3: [B3.6].~A() (Implicit destructor) 1256 // CHECK-NEXT: 4: CFGScopeEnd(n1s) 1257 // CHECK-NEXT: 5: CFGScopeBegin(n1t) 1258 // CHECK-NEXT: 6: int n1t; 1259 // CHECK-NEXT: 7: CFGScopeBegin(n2t) 1260 // CHECK-NEXT: 8: int n2t; 1261 // CHECK-NEXT: Succs (1): B1 1262 // CHECK: [B3] 1263 // CHECK-NEXT: 1: CFGScopeBegin(a) 1264 // CHECK-NEXT: 2: (CXXConstructExpr, [B3.3], A) 1265 // CHECK-NEXT: 3: A a; 1266 // CHECK-NEXT: 4: CFGScopeBegin(n1s) 1267 // CHECK-NEXT: 5: (CXXConstructExpr, [B3.6], A) 1268 // CHECK-NEXT: 6: A n1s; 1269 // CHECK-NEXT: 7: CFGScopeBegin(n2s) 1270 // CHECK-NEXT: 8: (CXXConstructExpr, [B3.9], A) 1271 // CHECK-NEXT: 9: A n2s; 1272 // CHECK-NEXT: 10: [B3.9].~A() (Implicit destructor) 1273 // CHECK-NEXT: 11: CFGScopeEnd(n2s) 1274 // CHECK-NEXT: 12: [B3.6].~A() (Implicit destructor) 1275 // CHECK-NEXT: 13: CFGScopeEnd(n1s) 1276 // CHECK-NEXT: 14: CFGScopeBegin(n1t) 1277 // CHECK-NEXT: 15: CFGScopeBegin(n2t) 1278 // CHECK-NEXT: T: goto label; 1279 // CHECK-NEXT: Preds (1): B4 1280 // CHECK-NEXT: Succs (1): B1 1281 // CHECK: [B0 (EXIT)] 1282 // CHECK-NEXT: Preds (1): B1 1283 void test_goto_multiple_scopes() { 1284 A a; 1285 { 1286 A n1s; 1287 { 1288 A n2s; 1289 goto label; 1290 } 1291 } 1292 { 1293 int n1t; 1294 { 1295 int n2t; 1296 label: 1297 } 1298 } 1299 } 1300 1301 // CHECK: [B5 (ENTRY)] 1302 // CHECK-NEXT: Succs (1): B3 1303 // CHECK: [B1] 1304 // CHECK-NEXT: 1: [B2.8].~A() (Implicit destructor) 1305 // CHECK-NEXT: 2: CFGScopeEnd(n2s) 1306 // CHECK-NEXT: 3: [B2.5].~A() (Implicit destructor) 1307 // CHECK-NEXT: 4: CFGScopeEnd(n1s) 1308 // CHECK-NEXT: 5: [B3.3].~A() (Implicit destructor) 1309 // CHECK-NEXT: 6: CFGScopeEnd(a) 1310 // CHECK-NEXT: Succs (1): B0 1311 // CHECK: [B2] 1312 // CHECK-NEXT: label: 1313 // CHECK-NEXT: 1: CFGScopeEnd(n2t) 1314 // CHECK-NEXT: 2: CFGScopeEnd(n1t) 1315 // CHECK-NEXT: 3: CFGScopeBegin(n1s) 1316 // CHECK-NEXT: 4: (CXXConstructExpr, [B2.5], A) 1317 // CHECK-NEXT: 5: A n1s; 1318 // CHECK-NEXT: 6: CFGScopeBegin(n2s) 1319 // CHECK-NEXT: 7: (CXXConstructExpr, [B2.8], A) 1320 // CHECK-NEXT: 8: A n2s; 1321 // CHECK-NEXT: Preds (2): B3 B4 1322 // CHECK-NEXT: Succs (1): B4 1323 // CHECK: [B3] 1324 // CHECK-NEXT: 1: CFGScopeBegin(a) 1325 // CHECK-NEXT: 2: (CXXConstructExpr, [B3.3], A) 1326 // CHECK-NEXT: 3: A a; 1327 // CHECK-NEXT: 4: CFGScopeBegin(n1t) 1328 // CHECK-NEXT: 5: int n1t; 1329 // CHECK-NEXT: 6: CFGScopeBegin(n2t) 1330 // CHECK-NEXT: 7: int n2t; 1331 // CHECK-NEXT: Preds (1): B5 1332 // CHECK-NEXT: Succs (1): B2 1333 // CHECK: [B4] 1334 // CHECK-NEXT: 1: [B2.8].~A() (Implicit destructor) 1335 // CHECK-NEXT: 2: CFGScopeEnd(n2s) 1336 // CHECK-NEXT: 3: [B2.5].~A() (Implicit destructor) 1337 // CHECK-NEXT: 4: CFGScopeEnd(n1s) 1338 // CHECK-NEXT: 5: CFGScopeBegin(n1t) 1339 // CHECK-NEXT: 6: CFGScopeBegin(n2t) 1340 // CHECK-NEXT: T: goto label; 1341 // CHECK-NEXT: Preds (1): B2 1342 // CHECK-NEXT: Succs (1): B2 1343 // CHECK: [B0 (EXIT)] 1344 // CHECK-NEXT: Preds (1): B1 1345 void test_backpatched_goto_multiple_scopes() { 1346 A a; 1347 { 1348 int n1t; 1349 { 1350 int n2t; 1351 label: 1352 } 1353 } 1354 { 1355 A n1s; 1356 { 1357 A n2s; 1358 goto label; 1359 } 1360 } 1361 } 1362 1363 // CHECK: [B8 (ENTRY)] 1364 // CHECK-NEXT: Succs (1): B7 1365 // CHECK: [B1] 1366 // CHECK-NEXT: label: 1367 // CHECK-NEXT: 1: CFGScopeEnd(n2t) 1368 // CHECK-NEXT: 2: CFGScopeEnd(n1t) 1369 // CHECK-NEXT: Preds (4): B2 B3 B4 B6 1370 // CHECK-NEXT: Succs (1): B0 1371 // CHECK: [B2] 1372 // CHECK-NEXT: T: goto label; 1373 // CHECK-NEXT: Preds (1): B3 1374 // CHECK-NEXT: Succs (1): B1 1375 // CHECK: [B3] 1376 // CHECK-NEXT: 1: CFGScopeBegin(n2t) 1377 // CHECK-NEXT: 2: int n2t; 1378 // CHECK-NEXT: 3: UV 1379 // CHECK-NEXT: 4: [B3.3] (ImplicitCastExpr, LValueToRValue, _Bool) 1380 // CHECK-NEXT: T: if [B3.4] 1381 // CHECK-NEXT: Preds (1): B5 1382 // CHECK-NEXT: Succs (2): B2 B1 1383 // CHECK: [B4] 1384 // CHECK-NEXT: 1: CFGScopeBegin(n2t) 1385 // CHECK-NEXT: T: goto label; 1386 // CHECK-NEXT: Preds (1): B5 1387 // CHECK-NEXT: Succs (1): B1 1388 // CHECK: [B5] 1389 // CHECK-NEXT: 1: CFGScopeBegin(n1t) 1390 // CHECK-NEXT: 2: int n1t; 1391 // CHECK-NEXT: 3: UV 1392 // CHECK-NEXT: 4: [B5.3] (ImplicitCastExpr, LValueToRValue, _Bool) 1393 // CHECK-NEXT: T: if [B5.4] 1394 // CHECK-NEXT: Preds (1): B7 1395 // CHECK-NEXT: Succs (2): B4 B3 1396 // CHECK: [B6] 1397 // CHECK-NEXT: 1: CFGScopeBegin(n1t) 1398 // CHECK-NEXT: 2: CFGScopeBegin(n2t) 1399 // CHECK-NEXT: T: goto label; 1400 // CHECK-NEXT: Preds (1): B7 1401 // CHECK-NEXT: Succs (1): B1 1402 // CHECK: [B7] 1403 // CHECK-NEXT: 1: UV 1404 // CHECK-NEXT: 2: [B7.1] (ImplicitCastExpr, LValueToRValue, _Bool) 1405 // CHECK-NEXT: T: if [B7.2] 1406 // CHECK-NEXT: Preds (1): B8 1407 // CHECK-NEXT: Succs (2): B6 B5 1408 // CHECK: [B0 (EXIT)] 1409 // CHECK-NEXT: Preds (1): B1 1410 void test_multiple_goto_entering_scopes() { 1411 if (UV) goto label; 1412 { 1413 int n1t; 1414 if (UV) goto label; 1415 { 1416 int n2t; 1417 if (UV) goto label; 1418 label: 1419 } 1420 } 1421 } 1422 1423 // CHECK: [B1] 1424 // CHECK-NEXT: 1: CFGScopeBegin(i) 1425 // CHECK-NEXT: 2: int i __attribute__((cleanup(cleanup_int))); 1426 // CHECK-NEXT: 3: CleanupFunction (cleanup_int) 1427 // CHECK-NEXT: 4: CFGScopeEnd(i) 1428 void cleanup_int(int *i); 1429 void test_cleanup_functions() { 1430 int i __attribute__((cleanup(cleanup_int))); 1431 } 1432 1433 // CHECK: [B1] 1434 // CHECK-NEXT: 1: 10 1435 // CHECK-NEXT: 2: i 1436 // CHECK-NEXT: 3: [B1.2] = [B1.1] 1437 // CHECK-NEXT: 4: return; 1438 // CHECK-NEXT: 5: CleanupFunction (cleanup_int) 1439 // CHECK-NEXT: 6: CFGScopeEnd(i) 1440 // CHECK-NEXT: Preds (1): B3 1441 // CHECK-NEXT: Succs (1): B0 1442 // CHECK: [B2] 1443 // CHECK-NEXT: 1: return; 1444 // CHECK-NEXT: 2: CleanupFunction (cleanup_int) 1445 // CHECK-NEXT: 3: CFGScopeEnd(i) 1446 // CHECK-NEXT: Preds (1): B3 1447 // CHECK-NEXT: Succs (1): B0 1448 // CHECK: [B3] 1449 // CHECK-NEXT: 1: CFGScopeBegin(i) 1450 // CHECK-NEXT: 2: int i __attribute__((cleanup(cleanup_int))); 1451 // CHECK-NEXT: 3: m 1452 // CHECK-NEXT: 4: [B3.3] (ImplicitCastExpr, LValueToRValue, int) 1453 // CHECK-NEXT: 5: 1 1454 // CHECK-NEXT: 6: [B3.4] == [B3.5] 1455 // CHECK-NEXT: T: if [B3.6] 1456 // CHECK-NEXT: Preds (1): B4 1457 // CHECK-NEXT: Succs (2): B2 B1 1458 void test_cleanup_functions2(int m) { 1459 int i __attribute__((cleanup(cleanup_int))); 1460 1461 if (m == 1) { 1462 return; 1463 } 1464 1465 i = 10; 1466 return; 1467 } 1468 1469 // CHECK: [B1] 1470 // CHECK-NEXT: 1: CFGScopeBegin(f) 1471 // CHECK-NEXT: 2: (CXXConstructExpr, [B1.3], F) 1472 // CHECK-NEXT: 3: F f __attribute__((cleanup(cleanup_F))); 1473 // CHECK-NEXT: 4: CleanupFunction (cleanup_F) 1474 // CHECK-NEXT: 5: [B1.3].~F() (Implicit destructor) 1475 // CHECK-NEXT: 6: CFGScopeEnd(f) 1476 // CHECK-NEXT: Preds (1): B2 1477 // CHECK-NEXT: Succs (1): B0 1478 class F { 1479 public: 1480 ~F(); 1481 }; 1482 void cleanup_F(F *f); 1483 1484 void test() { 1485 F f __attribute((cleanup(cleanup_F))); 1486 } 1487