1 // RUN: %clang_cc1 -fcxx-exceptions -fexceptions -analyze -analyzer-checker=debug.DumpCFG %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 }; 29 30 extern const bool UV; 31 32 // CHECK: [B2 (ENTRY)] 33 // CHECK-NEXT: Succs (1): B1 34 // CHECK: [B1] 35 // CHECK-NEXT: 1: (CXXConstructExpr, class A) 36 // CHECK-NEXT: 2: A a; 37 // CHECK-NEXT: 3: a 38 // CHECK-NEXT: 4: [B1.3] (ImplicitCastExpr, NoOp, const class A) 39 // CHECK-NEXT: 5: const A &b = a; 40 // CHECK-NEXT: 6: A() (CXXConstructExpr, class A) 41 // CHECK-NEXT: 7: [B1.6] (BindTemporary) 42 // CHECK-NEXT: 8: [B1.7] (ImplicitCastExpr, NoOp, const class A) 43 // CHECK-NEXT: 9: [B1.8] 44 // CHECK: 10: const A &c = A(); 45 // CHECK: 11: [B1.10].~A() (Implicit destructor) 46 // CHECK: 12: [B1.2].~A() (Implicit destructor) 47 // CHECK-NEXT: Preds (1): B2 48 // CHECK-NEXT: Succs (1): B0 49 // CHECK: [B0 (EXIT)] 50 // CHECK-NEXT: Preds (1): B1 51 void test_const_ref() { 52 A a; 53 const A& b = a; 54 const A& c = A(); 55 } 56 57 // CHECK: [B2 (ENTRY)] 58 // CHECK-NEXT: Succs (1): B1 59 // CHECK: [B1] 60 // CHECK-NEXT: 1: (CXXConstructExpr, class A [2]) 61 // CHECK-NEXT: 2: A a[2]; 62 // CHECK-NEXT: 3: (CXXConstructExpr, class A [0]) 63 // CHECK-NEXT: 4: A b[0]; 64 // CHECK-NEXT: 5: [B1.2].~A() (Implicit destructor) 65 // CHECK-NEXT: Preds (1): B2 66 // CHECK-NEXT: Succs (1): B0 67 // CHECK: [B0 (EXIT)] 68 // CHECK-NEXT: Preds (1): B1 69 void test_array() { 70 A a[2]; 71 A b[0]; 72 } 73 74 // CHECK: [B2 (ENTRY)] 75 // CHECK-NEXT: Succs (1): B1 76 // CHECK: [B1] 77 // CHECK-NEXT: 1: (CXXConstructExpr, class A) 78 // CHECK-NEXT: 2: A a; 79 // CHECK-NEXT: 3: (CXXConstructExpr, class A) 80 // CHECK-NEXT: 4: A c; 81 // CHECK-NEXT: 5: (CXXConstructExpr, class A) 82 // CHECK-NEXT: 6: A d; 83 // CHECK-NEXT: 7: [B1.6].~A() (Implicit destructor) 84 // CHECK-NEXT: 8: [B1.4].~A() (Implicit destructor) 85 // CHECK-NEXT: 9: (CXXConstructExpr, class A) 86 // CHECK: 10: A b; 87 // CHECK: 11: [B1.10].~A() (Implicit destructor) 88 // CHECK: 12: [B1.2].~A() (Implicit destructor) 89 // CHECK-NEXT: Preds (1): B2 90 // CHECK-NEXT: Succs (1): B0 91 // CHECK: [B0 (EXIT)] 92 // CHECK-NEXT: Preds (1): B1 93 void test_scope() { 94 A a; 95 { A c; 96 A d; 97 } 98 A b; 99 } 100 101 // CHECK: [B4 (ENTRY)] 102 // CHECK-NEXT: Succs (1): B3 103 // CHECK: [B1] 104 // CHECK-NEXT: 1: (CXXConstructExpr, class A) 105 // CHECK-NEXT: 2: A c; 106 // CHECK-NEXT: 3: [B1.2].~A() (Implicit destructor) 107 // CHECK-NEXT: 4: [B3.4].~A() (Implicit destructor) 108 // CHECK-NEXT: 5: [B3.2].~A() (Implicit destructor) 109 // CHECK-NEXT: Preds (1): B3 110 // CHECK-NEXT: Succs (1): B0 111 // CHECK: [B2] 112 // CHECK-NEXT: 1: return; 113 // CHECK-NEXT: 2: [B3.4].~A() (Implicit destructor) 114 // CHECK-NEXT: 3: [B3.2].~A() (Implicit destructor) 115 // CHECK-NEXT: Preds (1): B3 116 // CHECK-NEXT: Succs (1): B0 117 // CHECK: [B3] 118 // CHECK-NEXT: 1: (CXXConstructExpr, class A) 119 // CHECK-NEXT: 2: A a; 120 // CHECK-NEXT: 3: (CXXConstructExpr, class A) 121 // CHECK-NEXT: 4: A b; 122 // CHECK-NEXT: 5: UV 123 // CHECK-NEXT: 6: [B3.5] (ImplicitCastExpr, LValueToRValue, _Bool) 124 // CHECK-NEXT: T: if [B3.6] 125 // CHECK-NEXT: Preds (1): B4 126 // CHECK-NEXT: Succs (2): B2 B1 127 // CHECK: [B0 (EXIT)] 128 // CHECK-NEXT: Preds (2): B1 B2 129 void test_return() { 130 A a; 131 A b; 132 if (UV) return; 133 A c; 134 } 135 136 // CHECK: [B8 (ENTRY)] 137 // CHECK-NEXT: Succs (1): B7 138 // CHECK: [B1] 139 // CHECK: l1: 140 // CHECK-NEXT: 1: (CXXConstructExpr, class A) 141 // CHECK-NEXT: 2: A c; 142 // CHECK-NEXT: 3: [B1.2].~A() (Implicit destructor) 143 // CHECK-NEXT: 4: [B6.2].~A() (Implicit destructor) 144 // CHECK-NEXT: 5: [B7.2].~A() (Implicit destructor) 145 // CHECK-NEXT: Preds (2): B2 B3 146 // CHECK-NEXT: Succs (1): B0 147 // CHECK: [B2] 148 // CHECK-NEXT: 1: (CXXConstructExpr, class A) 149 // CHECK-NEXT: 2: A b; 150 // CHECK-NEXT: 3: [B2.2].~A() (Implicit destructor) 151 // CHECK-NEXT: 4: [B6.4].~A() (Implicit destructor) 152 // CHECK-NEXT: Preds (1): B4 153 // CHECK-NEXT: Succs (1): B1 154 // CHECK: [B3] 155 // CHECK-NEXT: 1: [B6.4].~A() (Implicit destructor) 156 // CHECK-NEXT: T: goto l1; 157 // CHECK: Preds (1): B4 158 // CHECK-NEXT: Succs (1): B1 159 // CHECK: [B4] 160 // CHECK-NEXT: 1: UV 161 // CHECK-NEXT: 2: [B4.1] (ImplicitCastExpr, LValueToRValue, _Bool) 162 // CHECK-NEXT: T: if [B4.2] 163 // CHECK-NEXT: Preds (1): B6 164 // CHECK-NEXT: Succs (2): B3 B2 165 // CHECK: [B5] 166 // CHECK-NEXT: 1: [B6.4].~A() (Implicit destructor) 167 // CHECK-NEXT: 2: [B6.2].~A() (Implicit destructor) 168 // CHECK-NEXT: T: goto l0; 169 // CHECK: Preds (1): B6 170 // CHECK-NEXT: Succs (1): B6 171 // CHECK: [B6] 172 // CHECK: l0: 173 // CHECK-NEXT: 1: (CXXConstructExpr, class A) 174 // CHECK-NEXT: 2: A b; 175 // CHECK-NEXT: 3: (CXXConstructExpr, class A) 176 // CHECK-NEXT: 4: A a; 177 // CHECK-NEXT: 5: UV 178 // CHECK-NEXT: 6: [B6.5] (ImplicitCastExpr, LValueToRValue, _Bool) 179 // CHECK-NEXT: T: if [B6.6] 180 // CHECK-NEXT: Preds (2): B7 B5 181 // CHECK-NEXT: Succs (2): B5 B4 182 // CHECK: [B7] 183 // CHECK-NEXT: 1: (CXXConstructExpr, class A) 184 // CHECK-NEXT: 2: A a; 185 // CHECK-NEXT: Preds (1): B8 186 // CHECK-NEXT: Succs (1): B6 187 // CHECK: [B0 (EXIT)] 188 // CHECK-NEXT: Preds (1): B1 189 void test_goto() { 190 A a; 191 l0: 192 A b; 193 { A a; 194 if (UV) goto l0; 195 if (UV) goto l1; 196 A b; 197 } 198 l1: 199 A c; 200 } 201 202 // CHECK: [B5 (ENTRY)] 203 // CHECK-NEXT: Succs (1): B4 204 // CHECK: [B1] 205 // CHECK-NEXT: 1: [B4.6].~A() (Implicit destructor) 206 // CHECK-NEXT: 2: [B4.2].~A() (Implicit destructor) 207 // CHECK-NEXT: Preds (2): B2 B3 208 // CHECK-NEXT: Succs (1): B0 209 // CHECK: [B2] 210 // CHECK-NEXT: 1: (CXXConstructExpr, class A) 211 // CHECK-NEXT: 2: A c; 212 // CHECK-NEXT: 3: [B2.2].~A() (Implicit destructor) 213 // CHECK-NEXT: Preds (1): B4 214 // CHECK-NEXT: Succs (1): B1 215 // CHECK: [B3] 216 // CHECK-NEXT: 1: (CXXConstructExpr, class A) 217 // CHECK-NEXT: 2: A c; 218 // CHECK-NEXT: 3: [B3.2].~A() (Implicit destructor) 219 // CHECK-NEXT: Preds (1): B4 220 // CHECK-NEXT: Succs (1): B1 221 // CHECK: [B4] 222 // CHECK-NEXT: 1: (CXXConstructExpr, class A) 223 // CHECK-NEXT: 2: A a; 224 // CHECK-NEXT: 3: a 225 // CHECK-NEXT: 4: [B4.3] (ImplicitCastExpr, NoOp, const class A) 226 // CHECK-NEXT: 5: [B4.4] (CXXConstructExpr, class A) 227 // CHECK-NEXT: 6: A b = a; 228 // CHECK-NEXT: 7: b 229 // CHECK-NEXT: 8: [B4.7] (ImplicitCastExpr, NoOp, const class A) 230 // CHECK-NEXT: 9: [B4.8].operator int 231 // CHECK: 10: [B4.8] 232 // CHECK: 11: [B4.10] (ImplicitCastExpr, UserDefinedConversion, int) 233 // CHECK: 12: [B4.11] (ImplicitCastExpr, IntegralToBoolean, _Bool) 234 // CHECK-NEXT: T: if [B4.12] 235 // CHECK-NEXT: Preds (1): B5 236 // CHECK-NEXT: Succs (2): B3 B2 237 // CHECK: [B0 (EXIT)] 238 // CHECK-NEXT: Preds (1): B1 239 void test_if_implicit_scope() { 240 A a; 241 if (A b = a) 242 A c; 243 else A c; 244 } 245 246 // CHECK: [B9 (ENTRY)] 247 // CHECK-NEXT: Succs (1): B8 248 // CHECK: [B1] 249 // CHECK-NEXT: 1: [B8.6].~A() (Implicit destructor) 250 // CHECK-NEXT: 2: (CXXConstructExpr, class A) 251 // CHECK-NEXT: 3: A e; 252 // CHECK-NEXT: 4: [B1.3].~A() (Implicit destructor) 253 // CHECK-NEXT: 5: [B8.2].~A() (Implicit destructor) 254 // CHECK-NEXT: Preds (2): B2 B5 255 // CHECK-NEXT: Succs (1): B0 256 // CHECK: [B2] 257 // CHECK-NEXT: 1: (CXXConstructExpr, class A) 258 // CHECK-NEXT: 2: A d; 259 // CHECK-NEXT: 3: [B2.2].~A() (Implicit destructor) 260 // CHECK-NEXT: 4: [B4.2].~A() (Implicit destructor) 261 // CHECK-NEXT: Preds (1): B4 262 // CHECK-NEXT: Succs (1): B1 263 // CHECK: [B3] 264 // CHECK-NEXT: 1: return; 265 // CHECK-NEXT: 2: [B4.2].~A() (Implicit destructor) 266 // CHECK-NEXT: 3: [B8.6].~A() (Implicit destructor) 267 // CHECK-NEXT: 4: [B8.2].~A() (Implicit destructor) 268 // CHECK-NEXT: Preds (1): B4 269 // CHECK-NEXT: Succs (1): B0 270 // CHECK: [B4] 271 // CHECK-NEXT: 1: (CXXConstructExpr, class A) 272 // CHECK-NEXT: 2: A c; 273 // CHECK-NEXT: 3: UV 274 // CHECK-NEXT: 4: [B4.3] (ImplicitCastExpr, LValueToRValue, _Bool) 275 // CHECK-NEXT: T: if [B4.4] 276 // CHECK-NEXT: Preds (1): B8 277 // CHECK-NEXT: Succs (2): B3 B2 278 // CHECK: [B5] 279 // CHECK-NEXT: 1: (CXXConstructExpr, class A) 280 // CHECK-NEXT: 2: A d; 281 // CHECK-NEXT: 3: [B5.2].~A() (Implicit destructor) 282 // CHECK-NEXT: 4: [B7.2].~A() (Implicit destructor) 283 // CHECK-NEXT: Preds (1): B7 284 // CHECK-NEXT: Succs (1): B1 285 // CHECK: [B6] 286 // CHECK-NEXT: 1: return; 287 // CHECK-NEXT: 2: [B7.2].~A() (Implicit destructor) 288 // CHECK-NEXT: 3: [B8.6].~A() (Implicit destructor) 289 // CHECK-NEXT: 4: [B8.2].~A() (Implicit destructor) 290 // CHECK-NEXT: Preds (1): B7 291 // CHECK-NEXT: Succs (1): B0 292 // CHECK: [B7] 293 // CHECK-NEXT: 1: (CXXConstructExpr, class A) 294 // CHECK-NEXT: 2: A c; 295 // CHECK-NEXT: 3: UV 296 // CHECK-NEXT: 4: [B7.3] (ImplicitCastExpr, LValueToRValue, _Bool) 297 // CHECK-NEXT: T: if [B7.4] 298 // CHECK-NEXT: Preds (1): B8 299 // CHECK-NEXT: Succs (2): B6 B5 300 // CHECK: [B8] 301 // CHECK-NEXT: 1: (CXXConstructExpr, class A) 302 // CHECK-NEXT: 2: A a; 303 // CHECK-NEXT: 3: a 304 // CHECK-NEXT: 4: [B8.3] (ImplicitCastExpr, NoOp, const class A) 305 // CHECK-NEXT: 5: [B8.4] (CXXConstructExpr, class A) 306 // CHECK-NEXT: 6: A b = a; 307 // CHECK-NEXT: 7: b 308 // CHECK-NEXT: 8: [B8.7] (ImplicitCastExpr, NoOp, const class A) 309 // CHECK-NEXT: 9: [B8.8].operator int 310 // CHECK: 10: [B8.8] 311 // CHECK: 11: [B8.10] (ImplicitCastExpr, UserDefinedConversion, int) 312 // CHECK: 12: [B8.11] (ImplicitCastExpr, IntegralToBoolean, _Bool) 313 // CHECK-NEXT: T: if [B8.12] 314 // CHECK-NEXT: Preds (1): B9 315 // CHECK-NEXT: Succs (2): B7 B4 316 // CHECK: [B0 (EXIT)] 317 // CHECK-NEXT: Preds (3): B1 B3 B6 318 void test_if_jumps() { 319 A a; 320 if (A b = a) { 321 A c; 322 if (UV) return; 323 A d; 324 } else { 325 A c; 326 if (UV) return; 327 A d; 328 } 329 A e; 330 } 331 332 // CHECK: [B6 (ENTRY)] 333 // CHECK-NEXT: Succs (1): B5 334 // CHECK: [B1] 335 // CHECK-NEXT: 1: [B4.4].~A() (Implicit destructor) 336 // CHECK-NEXT: 2: [B5.2].~A() (Implicit destructor) 337 // CHECK-NEXT: Preds (1): B4 338 // CHECK-NEXT: Succs (1): B0 339 // CHECK: [B2] 340 // CHECK-NEXT: Preds (1): B3 341 // CHECK-NEXT: Succs (1): B4 342 // CHECK: [B3] 343 // CHECK-NEXT: 1: (CXXConstructExpr, class A) 344 // CHECK-NEXT: 2: A c; 345 // CHECK-NEXT: 3: [B3.2].~A() (Implicit destructor) 346 // CHECK-NEXT: 4: [B4.4].~A() (Implicit destructor) 347 // CHECK-NEXT: Preds (1): B4 348 // CHECK-NEXT: Succs (1): B2 349 // CHECK: [B4] 350 // CHECK-NEXT: 1: a 351 // CHECK-NEXT: 2: [B4.1] (ImplicitCastExpr, NoOp, const class A) 352 // CHECK-NEXT: 3: [B4.2] (CXXConstructExpr, class A) 353 // CHECK-NEXT: 4: A b = a; 354 // CHECK-NEXT: 5: b 355 // CHECK-NEXT: 6: [B4.5] (ImplicitCastExpr, NoOp, const class A) 356 // CHECK-NEXT: 7: [B4.6].operator int 357 // CHECK-NEXT: 8: [B4.6] 358 // CHECK-NEXT: 9: [B4.8] (ImplicitCastExpr, UserDefinedConversion, int) 359 // CHECK: 10: [B4.9] (ImplicitCastExpr, IntegralToBoolean, _Bool) 360 // CHECK-NEXT: T: while [B4.10] 361 // CHECK-NEXT: Preds (2): B2 B5 362 // CHECK-NEXT: Succs (2): B3 B1 363 // CHECK: [B5] 364 // CHECK-NEXT: 1: (CXXConstructExpr, class A) 365 // CHECK-NEXT: 2: A a; 366 // CHECK-NEXT: Preds (1): B6 367 // CHECK-NEXT: Succs (1): B4 368 // CHECK: [B0 (EXIT)] 369 // CHECK-NEXT: Preds (1): B1 370 void test_while_implicit_scope() { 371 A a; 372 while (A b = a) 373 A c; 374 } 375 376 // CHECK: [B12 (ENTRY)] 377 // CHECK-NEXT: Succs (1): B11 378 // CHECK: [B1] 379 // CHECK-NEXT: 1: [B10.4].~A() (Implicit destructor) 380 // CHECK-NEXT: 2: (CXXConstructExpr, class A) 381 // CHECK-NEXT: 3: A e; 382 // CHECK-NEXT: 4: [B1.3].~A() (Implicit destructor) 383 // CHECK-NEXT: 5: [B11.2].~A() (Implicit destructor) 384 // CHECK-NEXT: Preds (2): B8 B10 385 // CHECK-NEXT: Succs (1): B0 386 // CHECK: [B2] 387 // CHECK-NEXT: Preds (2): B3 B6 388 // CHECK-NEXT: Succs (1): B10 389 // CHECK: [B3] 390 // CHECK-NEXT: 1: (CXXConstructExpr, class A) 391 // CHECK-NEXT: 2: A d; 392 // CHECK-NEXT: 3: [B3.2].~A() (Implicit destructor) 393 // CHECK-NEXT: 4: [B9.2].~A() (Implicit destructor) 394 // CHECK-NEXT: 5: [B10.4].~A() (Implicit destructor) 395 // CHECK-NEXT: Preds (1): B5 396 // CHECK-NEXT: Succs (1): B2 397 // CHECK: [B4] 398 // CHECK-NEXT: 1: return; 399 // CHECK-NEXT: 2: [B9.2].~A() (Implicit destructor) 400 // CHECK-NEXT: 3: [B10.4].~A() (Implicit destructor) 401 // CHECK-NEXT: 4: [B11.2].~A() (Implicit destructor) 402 // CHECK-NEXT: Preds (1): B5 403 // CHECK-NEXT: Succs (1): B0 404 // CHECK: [B5] 405 // CHECK-NEXT: 1: UV 406 // CHECK-NEXT: 2: [B5.1] (ImplicitCastExpr, LValueToRValue, _Bool) 407 // CHECK-NEXT: T: if [B5.2] 408 // CHECK-NEXT: Preds (1): B7 409 // CHECK-NEXT: Succs (2): B4 B3 410 // CHECK: [B6] 411 // CHECK-NEXT: 1: [B9.2].~A() (Implicit destructor) 412 // CHECK-NEXT: 2: [B10.4].~A() (Implicit destructor) 413 // CHECK-NEXT: T: continue; 414 // CHECK: Preds (1): B7 415 // CHECK-NEXT: Succs (1): B2 416 // CHECK: [B7] 417 // CHECK-NEXT: 1: UV 418 // CHECK-NEXT: 2: [B7.1] (ImplicitCastExpr, LValueToRValue, _Bool) 419 // CHECK-NEXT: T: if [B7.2] 420 // CHECK-NEXT: Preds (1): B9 421 // CHECK-NEXT: Succs (2): B6 B5 422 // CHECK: [B8] 423 // CHECK-NEXT: 1: [B9.2].~A() (Implicit destructor) 424 // CHECK-NEXT: T: break; 425 // CHECK: Preds (1): B9 426 // CHECK-NEXT: Succs (1): B1 427 // CHECK: [B9] 428 // CHECK-NEXT: 1: (CXXConstructExpr, class A) 429 // CHECK-NEXT: 2: A c; 430 // CHECK-NEXT: 3: UV 431 // CHECK-NEXT: 4: [B9.3] (ImplicitCastExpr, LValueToRValue, _Bool) 432 // CHECK-NEXT: T: if [B9.4] 433 // CHECK-NEXT: Preds (1): B10 434 // CHECK-NEXT: Succs (2): B8 B7 435 // CHECK: [B10] 436 // CHECK-NEXT: 1: a 437 // CHECK-NEXT: 2: [B10.1] (ImplicitCastExpr, NoOp, const class A) 438 // CHECK-NEXT: 3: [B10.2] (CXXConstructExpr, class A) 439 // CHECK-NEXT: 4: A b = a; 440 // CHECK-NEXT: 5: b 441 // CHECK-NEXT: 6: [B10.5] (ImplicitCastExpr, NoOp, const class A) 442 // CHECK-NEXT: 7: [B10.6].operator int 443 // CHECK-NEXT: 8: [B10.6] 444 // CHECK-NEXT: 9: [B10.8] (ImplicitCastExpr, UserDefinedConversion, int) 445 // CHECK: 10: [B10.9] (ImplicitCastExpr, IntegralToBoolean, _Bool) 446 // CHECK-NEXT: T: while [B10.10] 447 // CHECK-NEXT: Preds (2): B2 B11 448 // CHECK-NEXT: Succs (2): B9 B1 449 // CHECK: [B11] 450 // CHECK-NEXT: 1: (CXXConstructExpr, class A) 451 // CHECK-NEXT: 2: A a; 452 // CHECK-NEXT: Preds (1): B12 453 // CHECK-NEXT: Succs (1): B10 454 // CHECK: [B0 (EXIT)] 455 // CHECK-NEXT: Preds (2): B1 B4 456 void test_while_jumps() { 457 A a; 458 while (A b = a) { 459 A c; 460 if (UV) break; 461 if (UV) continue; 462 if (UV) return; 463 A d; 464 } 465 A e; 466 } 467 468 // CHECK: [B4 (ENTRY)] 469 // CHECK-NEXT: Succs (1): B2 470 // CHECK: [B1] 471 // CHECK-NEXT: 1: UV 472 // CHECK-NEXT: 2: [B1.1] (ImplicitCastExpr, LValueToRValue, _Bool) 473 // CHECK-NEXT: T: do ... while [B1.2] 474 // CHECK-NEXT: Preds (1): B2 475 // CHECK-NEXT: Succs (2): B3 B0 476 // CHECK: [B2] 477 // CHECK-NEXT: 1: (CXXConstructExpr, class A) 478 // CHECK-NEXT: 2: A a; 479 // CHECK-NEXT: 3: [B2.2].~A() (Implicit destructor) 480 // CHECK-NEXT: Preds (2): B3 B4 481 // CHECK-NEXT: Succs (1): B1 482 // CHECK: [B3] 483 // CHECK-NEXT: Preds (1): B1 484 // CHECK-NEXT: Succs (1): B2 485 // CHECK: [B0 (EXIT)] 486 // CHECK-NEXT: Preds (1): B1 487 void test_do_implicit_scope() { 488 do A a; 489 while (UV); 490 } 491 492 // CHECK: [B12 (ENTRY)] 493 // CHECK-NEXT: Succs (1): B11 494 // CHECK: [B1] 495 // CHECK-NEXT: 1: (CXXConstructExpr, class A) 496 // CHECK-NEXT: 2: A d; 497 // CHECK-NEXT: 3: [B1.2].~A() (Implicit destructor) 498 // CHECK-NEXT: 4: [B11.2].~A() (Implicit destructor) 499 // CHECK-NEXT: Preds (2): B8 B2 500 // CHECK-NEXT: Succs (1): B0 501 // CHECK: [B2] 502 // CHECK-NEXT: 1: UV 503 // CHECK-NEXT: 2: [B2.1] (ImplicitCastExpr, LValueToRValue, _Bool) 504 // CHECK-NEXT: T: do ... while [B2.2] 505 // CHECK-NEXT: Preds (2): B3 B6 506 // CHECK-NEXT: Succs (2): B10 B1 507 // CHECK: [B3] 508 // CHECK-NEXT: 1: (CXXConstructExpr, class A) 509 // CHECK-NEXT: 2: A c; 510 // CHECK-NEXT: 3: [B3.2].~A() (Implicit destructor) 511 // CHECK-NEXT: 4: [B9.2].~A() (Implicit destructor) 512 // CHECK-NEXT: Preds (1): B5 513 // CHECK-NEXT: Succs (1): B2 514 // CHECK: [B4] 515 // CHECK-NEXT: 1: return; 516 // CHECK-NEXT: 2: [B9.2].~A() (Implicit destructor) 517 // CHECK-NEXT: 3: [B11.2].~A() (Implicit destructor) 518 // CHECK-NEXT: Preds (1): B5 519 // CHECK-NEXT: Succs (1): B0 520 // CHECK: [B5] 521 // CHECK-NEXT: 1: UV 522 // CHECK-NEXT: 2: [B5.1] (ImplicitCastExpr, LValueToRValue, _Bool) 523 // CHECK-NEXT: T: if [B5.2] 524 // CHECK-NEXT: Preds (1): B7 525 // CHECK-NEXT: Succs (2): B4 B3 526 // CHECK: [B6] 527 // CHECK-NEXT: 1: [B9.2].~A() (Implicit destructor) 528 // CHECK-NEXT: T: continue; 529 // CHECK: Preds (1): B7 530 // CHECK-NEXT: Succs (1): B2 531 // CHECK: [B7] 532 // CHECK-NEXT: 1: UV 533 // CHECK-NEXT: 2: [B7.1] (ImplicitCastExpr, LValueToRValue, _Bool) 534 // CHECK-NEXT: T: if [B7.2] 535 // CHECK-NEXT: Preds (1): B9 536 // CHECK-NEXT: Succs (2): B6 B5 537 // CHECK: [B8] 538 // CHECK-NEXT: 1: [B9.2].~A() (Implicit destructor) 539 // CHECK-NEXT: T: break; 540 // CHECK: Preds (1): B9 541 // CHECK-NEXT: Succs (1): B1 542 // CHECK: [B9] 543 // CHECK-NEXT: 1: (CXXConstructExpr, class A) 544 // CHECK-NEXT: 2: A b; 545 // CHECK-NEXT: 3: UV 546 // CHECK-NEXT: 4: [B9.3] (ImplicitCastExpr, LValueToRValue, _Bool) 547 // CHECK-NEXT: T: if [B9.4] 548 // CHECK-NEXT: Preds (2): B10 B11 549 // CHECK-NEXT: Succs (2): B8 B7 550 // CHECK: [B10] 551 // CHECK-NEXT: Preds (1): B2 552 // CHECK-NEXT: Succs (1): B9 553 // CHECK: [B11] 554 // CHECK-NEXT: 1: (CXXConstructExpr, class A) 555 // CHECK-NEXT: 2: A a; 556 // CHECK-NEXT: Preds (1): B12 557 // CHECK-NEXT: Succs (1): B9 558 // CHECK: [B0 (EXIT)] 559 // CHECK-NEXT: Preds (2): B1 B4 560 void test_do_jumps() { 561 A a; 562 do { 563 A b; 564 if (UV) break; 565 if (UV) continue; 566 if (UV) return; 567 A c; 568 } while (UV); 569 A d; 570 } 571 572 // CHECK: [B4 (ENTRY)] 573 // CHECK-NEXT: Succs (1): B2 574 // CHECK: [B1] 575 // CHECK-NEXT: 1: [B2.6].~A() (Implicit destructor) 576 // CHECK-NEXT: 2: [B2.2].~A() (Implicit destructor) 577 // CHECK-NEXT: Preds (2): B3 B2 578 // CHECK-NEXT: Succs (1): B0 579 // CHECK: [B2] 580 // CHECK-NEXT: 1: (CXXConstructExpr, class A) 581 // CHECK-NEXT: 2: A a; 582 // CHECK-NEXT: 3: a 583 // CHECK-NEXT: 4: [B2.3] (ImplicitCastExpr, NoOp, const class A) 584 // CHECK-NEXT: 5: [B2.4] (CXXConstructExpr, class A) 585 // CHECK-NEXT: 6: A b = a; 586 // CHECK-NEXT: 7: b 587 // CHECK-NEXT: 8: [B2.7] (ImplicitCastExpr, NoOp, const class A) 588 // CHECK-NEXT: 9: [B2.8].operator int 589 // CHECK: 10: [B2.8] 590 // CHECK: 11: [B2.10] (ImplicitCastExpr, UserDefinedConversion, int) 591 // CHECK-NEXT: T: switch [B2.11] 592 // CHECK-NEXT: Preds (1): B4 593 // CHECK-NEXT: Succs (1): B1 594 // CHECK: [B3] 595 // CHECK-NEXT: 1: (CXXConstructExpr, class A) 596 // CHECK-NEXT: 2: A c; 597 // CHECK-NEXT: 3: [B3.2].~A() (Implicit destructor) 598 // CHECK-NEXT: Succs (1): B1 599 // CHECK: [B0 (EXIT)] 600 // CHECK-NEXT: Preds (1): B1 601 void test_switch_implicit_scope() { 602 A a; 603 switch (A b = a) 604 A c; 605 } 606 607 // CHECK: [B9 (ENTRY)] 608 // CHECK-NEXT: Succs (1): B2 609 // CHECK: [B1] 610 // CHECK-NEXT: 1: [B2.6].~A() (Implicit destructor) 611 // CHECK-NEXT: 2: (CXXConstructExpr, class A) 612 // CHECK-NEXT: 3: A g; 613 // CHECK-NEXT: 4: [B1.3].~A() (Implicit destructor) 614 // CHECK-NEXT: 5: [B2.2].~A() (Implicit destructor) 615 // CHECK-NEXT: Preds (3): B3 B7 B2 616 // CHECK-NEXT: Succs (1): B0 617 // CHECK: [B2] 618 // CHECK-NEXT: 1: (CXXConstructExpr, class A) 619 // CHECK-NEXT: 2: A a; 620 // CHECK-NEXT: 3: a 621 // CHECK-NEXT: 4: [B2.3] (ImplicitCastExpr, NoOp, const class A) 622 // CHECK-NEXT: 5: [B2.4] (CXXConstructExpr, class A) 623 // CHECK-NEXT: 6: A b = a; 624 // CHECK-NEXT: 7: b 625 // CHECK-NEXT: 8: [B2.7] (ImplicitCastExpr, NoOp, const class A) 626 // CHECK-NEXT: 9: [B2.8].operator int 627 // CHECK: 10: [B2.8] 628 // CHECK: 11: [B2.10] (ImplicitCastExpr, UserDefinedConversion, int) 629 // CHECK-NEXT: T: switch [B2.11] 630 // CHECK-NEXT: Preds (1): B9 631 // CHECK-NEXT: Succs (3): B3 B8 B1 632 // CHECK: [B3] 633 // CHECK: case 1: 634 // CHECK-NEXT: T: break; 635 // CHECK: Preds (2): B2 B4 636 // CHECK-NEXT: Succs (1): B1 637 // CHECK: [B4] 638 // CHECK-NEXT: 1: (CXXConstructExpr, class A) 639 // CHECK-NEXT: 2: A f; 640 // CHECK-NEXT: 3: [B4.2].~A() (Implicit destructor) 641 // CHECK-NEXT: 4: [B8.2].~A() (Implicit destructor) 642 // CHECK-NEXT: Preds (1): B6 643 // CHECK-NEXT: Succs (1): B3 644 // CHECK: [B5] 645 // CHECK-NEXT: 1: return; 646 // CHECK-NEXT: 2: [B8.2].~A() (Implicit destructor) 647 // CHECK-NEXT: 3: [B2.6].~A() (Implicit destructor) 648 // CHECK-NEXT: 4: [B2.2].~A() (Implicit destructor) 649 // CHECK-NEXT: Preds (1): B6 650 // CHECK-NEXT: Succs (1): B0 651 // CHECK: [B6] 652 // CHECK-NEXT: 1: UV 653 // CHECK-NEXT: 2: [B6.1] (ImplicitCastExpr, LValueToRValue, _Bool) 654 // CHECK-NEXT: T: if [B6.2] 655 // CHECK-NEXT: Preds (1): B8 656 // CHECK-NEXT: Succs (2): B5 B4 657 // CHECK: [B7] 658 // CHECK-NEXT: 1: [B8.2].~A() (Implicit destructor) 659 // CHECK-NEXT: T: break; 660 // CHECK: Preds (1): B8 661 // CHECK-NEXT: Succs (1): B1 662 // CHECK: [B8] 663 // CHECK: case 0: 664 // CHECK-NEXT: 1: (CXXConstructExpr, class A) 665 // CHECK-NEXT: 2: A c; 666 // CHECK-NEXT: 3: UV 667 // CHECK-NEXT: 4: [B8.3] (ImplicitCastExpr, LValueToRValue, _Bool) 668 // CHECK-NEXT: T: if [B8.4] 669 // CHECK-NEXT: Preds (1): B2 670 // CHECK-NEXT: Succs (2): B7 B6 671 // CHECK: [B0 (EXIT)] 672 // CHECK-NEXT: Preds (2): B1 B5 673 void test_switch_jumps() { 674 A a; 675 switch (A b = a) { 676 case 0: { 677 A c; 678 if (UV) break; 679 if (UV) return; 680 A f; 681 } 682 case 1: 683 break; 684 } 685 A g; 686 } 687 688 // CHECK: [B6 (ENTRY)] 689 // CHECK-NEXT: Succs (1): B5 690 // CHECK: [B1] 691 // CHECK-NEXT: 1: [B4.4].~A() (Implicit destructor) 692 // CHECK-NEXT: 2: [B5.2].~A() (Implicit destructor) 693 // CHECK-NEXT: Preds (1): B4 694 // CHECK-NEXT: Succs (1): B0 695 // CHECK: [B2] 696 // CHECK-NEXT: Preds (1): B3 697 // CHECK-NEXT: Succs (1): B4 698 // CHECK: [B3] 699 // CHECK-NEXT: 1: (CXXConstructExpr, class A) 700 // CHECK-NEXT: 2: A c; 701 // CHECK-NEXT: 3: [B3.2].~A() (Implicit destructor) 702 // CHECK-NEXT: 4: [B4.4].~A() (Implicit destructor) 703 // CHECK-NEXT: Preds (1): B4 704 // CHECK-NEXT: Succs (1): B2 705 // CHECK: [B4] 706 // CHECK-NEXT: 1: a 707 // CHECK-NEXT: 2: [B4.1] (ImplicitCastExpr, NoOp, const class A) 708 // CHECK-NEXT: 3: [B4.2] (CXXConstructExpr, class A) 709 // CHECK-NEXT: 4: A b = a; 710 // CHECK-NEXT: 5: b 711 // CHECK-NEXT: 6: [B4.5] (ImplicitCastExpr, NoOp, const class A) 712 // CHECK-NEXT: 7: [B4.6].operator int 713 // CHECK-NEXT: 8: [B4.6] 714 // CHECK-NEXT: 9: [B4.8] (ImplicitCastExpr, UserDefinedConversion, int) 715 // CHECK: 10: [B4.9] (ImplicitCastExpr, IntegralToBoolean, _Bool) 716 // CHECK-NEXT: T: for (...; [B4.10]; ) 717 // CHECK-NEXT: Preds (2): B2 B5 718 // CHECK-NEXT: Succs (2): B3 B1 719 // CHECK: [B5] 720 // CHECK-NEXT: 1: (CXXConstructExpr, class A) 721 // CHECK-NEXT: 2: A a; 722 // CHECK-NEXT: Preds (1): B6 723 // CHECK-NEXT: Succs (1): B4 724 // CHECK: [B0 (EXIT)] 725 // CHECK-NEXT: Preds (1): B1 726 void test_for_implicit_scope() { 727 for (A a; A b = a; ) 728 A c; 729 } 730 731 // CHECK: [B12 (ENTRY)] 732 // CHECK-NEXT: Succs (1): B11 733 // CHECK: [B1] 734 // CHECK-NEXT: 1: [B10.4].~A() (Implicit destructor) 735 // CHECK-NEXT: 2: [B11.4].~A() (Implicit destructor) 736 // CHECK-NEXT: 3: (CXXConstructExpr, class A) 737 // CHECK-NEXT: 4: A f; 738 // CHECK-NEXT: 5: [B1.4].~A() (Implicit destructor) 739 // CHECK-NEXT: 6: [B11.2].~A() (Implicit destructor) 740 // CHECK-NEXT: Preds (2): B8 B10 741 // CHECK-NEXT: Succs (1): B0 742 // CHECK: [B2] 743 // CHECK-NEXT: Preds (2): B3 B6 744 // CHECK-NEXT: Succs (1): B10 745 // CHECK: [B3] 746 // CHECK-NEXT: 1: (CXXConstructExpr, class A) 747 // CHECK-NEXT: 2: A e; 748 // CHECK-NEXT: 3: [B3.2].~A() (Implicit destructor) 749 // CHECK-NEXT: 4: [B9.2].~A() (Implicit destructor) 750 // CHECK-NEXT: 5: [B10.4].~A() (Implicit destructor) 751 // CHECK-NEXT: Preds (1): B5 752 // CHECK-NEXT: Succs (1): B2 753 // CHECK: [B4] 754 // CHECK-NEXT: 1: return; 755 // CHECK-NEXT: 2: [B9.2].~A() (Implicit destructor) 756 // CHECK-NEXT: 3: [B10.4].~A() (Implicit destructor) 757 // CHECK-NEXT: 4: [B11.4].~A() (Implicit destructor) 758 // CHECK-NEXT: 5: [B11.2].~A() (Implicit destructor) 759 // CHECK-NEXT: Preds (1): B5 760 // CHECK-NEXT: Succs (1): B0 761 // CHECK: [B5] 762 // CHECK-NEXT: 1: UV 763 // CHECK-NEXT: 2: [B5.1] (ImplicitCastExpr, LValueToRValue, _Bool) 764 // CHECK-NEXT: T: if [B5.2] 765 // CHECK-NEXT: Preds (1): B7 766 // CHECK-NEXT: Succs (2): B4 B3 767 // CHECK: [B6] 768 // CHECK-NEXT: 1: [B9.2].~A() (Implicit destructor) 769 // CHECK-NEXT: T: continue; 770 // CHECK: Preds (1): B7 771 // CHECK-NEXT: Succs (1): B2 772 // CHECK: [B7] 773 // CHECK-NEXT: 1: UV 774 // CHECK-NEXT: 2: [B7.1] (ImplicitCastExpr, LValueToRValue, _Bool) 775 // CHECK-NEXT: T: if [B7.2] 776 // CHECK-NEXT: Preds (1): B9 777 // CHECK-NEXT: Succs (2): B6 B5 778 // CHECK: [B8] 779 // CHECK-NEXT: 1: [B9.2].~A() (Implicit destructor) 780 // CHECK-NEXT: T: break; 781 // CHECK: Preds (1): B9 782 // CHECK-NEXT: Succs (1): B1 783 // CHECK: [B9] 784 // CHECK-NEXT: 1: (CXXConstructExpr, class A) 785 // CHECK-NEXT: 2: A d; 786 // CHECK-NEXT: 3: UV 787 // CHECK-NEXT: 4: [B9.3] (ImplicitCastExpr, LValueToRValue, _Bool) 788 // CHECK-NEXT: T: if [B9.4] 789 // CHECK-NEXT: Preds (1): B10 790 // CHECK-NEXT: Succs (2): B8 B7 791 // CHECK: [B10] 792 // CHECK-NEXT: 1: b 793 // CHECK-NEXT: 2: [B10.1] (ImplicitCastExpr, NoOp, const class A) 794 // CHECK-NEXT: 3: [B10.2] (CXXConstructExpr, class A) 795 // CHECK-NEXT: 4: A c = b; 796 // CHECK-NEXT: 5: c 797 // CHECK-NEXT: 6: [B10.5] (ImplicitCastExpr, NoOp, const class A) 798 // CHECK-NEXT: 7: [B10.6].operator int 799 // CHECK-NEXT: 8: [B10.6] 800 // CHECK-NEXT: 9: [B10.8] (ImplicitCastExpr, UserDefinedConversion, int) 801 // CHECK: 10: [B10.9] (ImplicitCastExpr, IntegralToBoolean, _Bool) 802 // CHECK-NEXT: T: for (...; [B10.10]; ) 803 // CHECK-NEXT: Preds (2): B2 B11 804 // CHECK-NEXT: Succs (2): B9 B1 805 // CHECK: [B11] 806 // CHECK-NEXT: 1: (CXXConstructExpr, class A) 807 // CHECK-NEXT: 2: A a; 808 // CHECK-NEXT: 3: (CXXConstructExpr, class A) 809 // CHECK-NEXT: 4: A b; 810 // CHECK-NEXT: Preds (1): B12 811 // CHECK-NEXT: Succs (1): B10 812 // CHECK: [B0 (EXIT)] 813 // CHECK-NEXT: Preds (2): B1 B4 814 void test_for_jumps() { 815 A a; 816 for (A b; A c = b; ) { 817 A d; 818 if (UV) break; 819 if (UV) continue; 820 if (UV) return; 821 A e; 822 } 823 A f; 824 } 825 826 // CHECK: [B3 (ENTRY)] 827 // CHECK-NEXT: Succs (1): B0 828 // CHECK: [B1] 829 // CHECK-NEXT: T: try ... 830 // CHECK-NEXT: Succs (2): B2 B0 831 // CHECK: [B2] 832 // CHECK-NEXT: catch (const A &e): 833 // CHECK-NEXT: 1: catch (const A &e) { 834 // CHECK-NEXT: } 835 // CHECK-NEXT: Preds (1): B1 836 // CHECK-NEXT: Succs (1): B0 837 // CHECK: [B0 (EXIT)] 838 // CHECK-NEXT: Preds (3): B2 B1 B3 839 void test_catch_const_ref() { 840 try { 841 } catch (const A& e) { 842 } 843 } 844 845 // CHECK: [B3 (ENTRY)] 846 // CHECK-NEXT: Succs (1): B0 847 // CHECK: [B1] 848 // CHECK-NEXT: T: try ... 849 // CHECK-NEXT: Succs (2): B2 B0 850 // CHECK: [B2] 851 // CHECK-NEXT: catch (A e): 852 // CHECK-NEXT: 1: catch (A e) { 853 // CHECK-NEXT: } 854 // CHECK-NEXT: 2: [B2.1].~A() (Implicit destructor) 855 // CHECK-NEXT: Preds (1): B1 856 // CHECK-NEXT: Succs (1): B0 857 // CHECK: [B0 (EXIT)] 858 // CHECK-NEXT: Preds (3): B2 B1 B3 859 void test_catch_copy() { 860 try { 861 } catch (A e) { 862 } 863 } 864