/test/Analysis/temp-obj-dtors-cfg-output.cpp

https://gitlab.com/pranith/clang · C++ · 848 lines · 85 code · 22 blank · 741 comment · 6 complexity · bf2d09d93f46f5685b8e03c9dffc3b0e MD5 · raw file

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