/external/clang/test/Analysis/auto-obj-dtors-cfg-output.cpp

https://gitlab.com/brian0218/rk3188_r-box_android4.2.2_sdk · C++ · 865 lines · 135 code · 21 blank · 709 comment · 28 complexity · 1a571f58416012b46f4338d123ebb9d4 MD5 · raw file

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