lock.pass.cpp 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523
  1. //===----------------------------------------------------------------------===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. //
  9. // UNSUPPORTED: libcpp-has-no-threads
  10. // This test hangs forever when built against libstdc++ and MSVC. In order to allow
  11. // validation of the test suite against other STLs we have to mark it
  12. // unsupported.
  13. // UNSUPPORTED: libstdc++, msvc
  14. // <mutex>
  15. // template <class L1, class L2, class... L3>
  16. // void lock(L1&, L2&, L3&...);
  17. #include <mutex>
  18. #include <cassert>
  19. #include "test_macros.h"
  20. class L0
  21. {
  22. bool locked_;
  23. public:
  24. L0() : locked_(false) {}
  25. void lock()
  26. {
  27. locked_ = true;
  28. }
  29. bool try_lock()
  30. {
  31. locked_ = true;
  32. return locked_;
  33. }
  34. void unlock() {locked_ = false;}
  35. bool locked() const {return locked_;}
  36. };
  37. class L1
  38. {
  39. bool locked_;
  40. public:
  41. L1() : locked_(false) {}
  42. void lock()
  43. {
  44. locked_ = true;
  45. }
  46. bool try_lock()
  47. {
  48. locked_ = false;
  49. return locked_;
  50. }
  51. void unlock() {locked_ = false;}
  52. bool locked() const {return locked_;}
  53. };
  54. class L2
  55. {
  56. bool locked_;
  57. public:
  58. L2() : locked_(false) {}
  59. void lock()
  60. {
  61. TEST_THROW(1);
  62. }
  63. bool try_lock()
  64. {
  65. TEST_THROW(1);
  66. return locked_;
  67. }
  68. void unlock() {locked_ = false;}
  69. bool locked() const {return locked_;}
  70. };
  71. int main(int, char**)
  72. {
  73. {
  74. L0 l0;
  75. L0 l1;
  76. std::lock(l0, l1);
  77. assert(l0.locked());
  78. assert(l1.locked());
  79. }
  80. {
  81. L0 l0;
  82. L1 l1;
  83. std::lock(l0, l1);
  84. assert(l0.locked());
  85. assert(l1.locked());
  86. }
  87. {
  88. L1 l0;
  89. L0 l1;
  90. std::lock(l0, l1);
  91. assert(l0.locked());
  92. assert(l1.locked());
  93. }
  94. #ifndef TEST_HAS_NO_EXCEPTIONS
  95. {
  96. L0 l0;
  97. L2 l1;
  98. try
  99. {
  100. std::lock(l0, l1);
  101. assert(false);
  102. }
  103. catch (int)
  104. {
  105. assert(!l0.locked());
  106. assert(!l1.locked());
  107. }
  108. }
  109. {
  110. L2 l0;
  111. L0 l1;
  112. try
  113. {
  114. std::lock(l0, l1);
  115. assert(false);
  116. }
  117. catch (int)
  118. {
  119. assert(!l0.locked());
  120. assert(!l1.locked());
  121. }
  122. }
  123. {
  124. L1 l0;
  125. L2 l1;
  126. try
  127. {
  128. std::lock(l0, l1);
  129. assert(false);
  130. }
  131. catch (int)
  132. {
  133. assert(!l0.locked());
  134. assert(!l1.locked());
  135. }
  136. }
  137. {
  138. L2 l0;
  139. L1 l1;
  140. try
  141. {
  142. std::lock(l0, l1);
  143. assert(false);
  144. }
  145. catch (int)
  146. {
  147. assert(!l0.locked());
  148. assert(!l1.locked());
  149. }
  150. }
  151. {
  152. L2 l0;
  153. L2 l1;
  154. try
  155. {
  156. std::lock(l0, l1);
  157. assert(false);
  158. }
  159. catch (int)
  160. {
  161. assert(!l0.locked());
  162. assert(!l1.locked());
  163. }
  164. }
  165. #endif
  166. #if TEST_STD_VER >= 11
  167. {
  168. L0 l0;
  169. L0 l1;
  170. L0 l2;
  171. std::lock(l0, l1, l2);
  172. assert(l0.locked());
  173. assert(l1.locked());
  174. assert(l2.locked());
  175. }
  176. #ifndef TEST_HAS_NO_EXCEPTIONS
  177. {
  178. L2 l0;
  179. L2 l1;
  180. L2 l2;
  181. try
  182. {
  183. std::lock(l0, l1, l2);
  184. assert(false);
  185. }
  186. catch (int)
  187. {
  188. assert(!l0.locked());
  189. assert(!l1.locked());
  190. assert(!l2.locked());
  191. }
  192. }
  193. #endif
  194. {
  195. L0 l0;
  196. L0 l1;
  197. L1 l2;
  198. std::lock(l0, l1, l2);
  199. assert(l0.locked());
  200. assert(l1.locked());
  201. assert(l2.locked());
  202. }
  203. {
  204. L0 l0;
  205. L1 l1;
  206. L0 l2;
  207. std::lock(l0, l1, l2);
  208. assert(l0.locked());
  209. assert(l1.locked());
  210. assert(l2.locked());
  211. }
  212. {
  213. L1 l0;
  214. L0 l1;
  215. L0 l2;
  216. std::lock(l0, l1, l2);
  217. assert(l0.locked());
  218. assert(l1.locked());
  219. assert(l2.locked());
  220. }
  221. #ifndef TEST_HAS_NO_EXCEPTIONS
  222. {
  223. L0 l0;
  224. L0 l1;
  225. L2 l2;
  226. try
  227. {
  228. std::lock(l0, l1, l2);
  229. assert(false);
  230. }
  231. catch (int)
  232. {
  233. assert(!l0.locked());
  234. assert(!l1.locked());
  235. assert(!l2.locked());
  236. }
  237. }
  238. {
  239. L0 l0;
  240. L2 l1;
  241. L0 l2;
  242. try
  243. {
  244. std::lock(l0, l1, l2);
  245. assert(false);
  246. }
  247. catch (int)
  248. {
  249. assert(!l0.locked());
  250. assert(!l1.locked());
  251. assert(!l2.locked());
  252. }
  253. }
  254. {
  255. L2 l0;
  256. L0 l1;
  257. L0 l2;
  258. try
  259. {
  260. std::lock(l0, l1, l2);
  261. assert(false);
  262. }
  263. catch (int)
  264. {
  265. assert(!l0.locked());
  266. assert(!l1.locked());
  267. assert(!l2.locked());
  268. }
  269. }
  270. {
  271. L2 l0;
  272. L2 l1;
  273. L0 l2;
  274. try
  275. {
  276. std::lock(l0, l1, l2);
  277. assert(false);
  278. }
  279. catch (int)
  280. {
  281. assert(!l0.locked());
  282. assert(!l1.locked());
  283. assert(!l2.locked());
  284. }
  285. }
  286. {
  287. L2 l0;
  288. L0 l1;
  289. L2 l2;
  290. try
  291. {
  292. std::lock(l0, l1, l2);
  293. assert(false);
  294. }
  295. catch (int)
  296. {
  297. assert(!l0.locked());
  298. assert(!l1.locked());
  299. assert(!l2.locked());
  300. }
  301. }
  302. {
  303. L0 l0;
  304. L2 l1;
  305. L2 l2;
  306. try
  307. {
  308. std::lock(l0, l1, l2);
  309. assert(false);
  310. }
  311. catch (int)
  312. {
  313. assert(!l0.locked());
  314. assert(!l1.locked());
  315. assert(!l2.locked());
  316. }
  317. }
  318. {
  319. L2 l0;
  320. L2 l1;
  321. L1 l2;
  322. try
  323. {
  324. std::lock(l0, l1, l2);
  325. assert(false);
  326. }
  327. catch (int)
  328. {
  329. assert(!l0.locked());
  330. assert(!l1.locked());
  331. assert(!l2.locked());
  332. }
  333. }
  334. {
  335. L2 l0;
  336. L1 l1;
  337. L2 l2;
  338. try
  339. {
  340. std::lock(l0, l1, l2);
  341. assert(false);
  342. }
  343. catch (int)
  344. {
  345. assert(!l0.locked());
  346. assert(!l1.locked());
  347. assert(!l2.locked());
  348. }
  349. }
  350. {
  351. L1 l0;
  352. L2 l1;
  353. L2 l2;
  354. try
  355. {
  356. std::lock(l0, l1, l2);
  357. assert(false);
  358. }
  359. catch (int)
  360. {
  361. assert(!l0.locked());
  362. assert(!l1.locked());
  363. assert(!l2.locked());
  364. }
  365. }
  366. #endif // TEST_HAS_NO_EXCEPTIONS
  367. {
  368. L0 l0;
  369. L0 l1;
  370. L0 l2;
  371. L0 l3;
  372. std::lock(l0, l1, l2, l3);
  373. assert(l0.locked());
  374. assert(l1.locked());
  375. assert(l2.locked());
  376. assert(l3.locked());
  377. }
  378. {
  379. L0 l0;
  380. L0 l1;
  381. L0 l2;
  382. L1 l3;
  383. std::lock(l0, l1, l2, l3);
  384. assert(l0.locked());
  385. assert(l1.locked());
  386. assert(l2.locked());
  387. assert(l3.locked());
  388. }
  389. {
  390. L0 l0;
  391. L0 l1;
  392. L1 l2;
  393. L0 l3;
  394. std::lock(l0, l1, l2, l3);
  395. assert(l0.locked());
  396. assert(l1.locked());
  397. assert(l2.locked());
  398. assert(l3.locked());
  399. }
  400. {
  401. L0 l0;
  402. L1 l1;
  403. L0 l2;
  404. L0 l3;
  405. std::lock(l0, l1, l2, l3);
  406. assert(l0.locked());
  407. assert(l1.locked());
  408. assert(l2.locked());
  409. assert(l3.locked());
  410. }
  411. {
  412. L1 l0;
  413. L0 l1;
  414. L0 l2;
  415. L0 l3;
  416. std::lock(l0, l1, l2, l3);
  417. assert(l0.locked());
  418. assert(l1.locked());
  419. assert(l2.locked());
  420. assert(l3.locked());
  421. }
  422. #ifndef TEST_HAS_NO_EXCEPTIONS
  423. {
  424. L0 l0;
  425. L0 l1;
  426. L0 l2;
  427. L2 l3;
  428. try
  429. {
  430. std::lock(l0, l1, l2, l3);
  431. assert(false);
  432. }
  433. catch (int)
  434. {
  435. assert(!l0.locked());
  436. assert(!l1.locked());
  437. assert(!l2.locked());
  438. assert(!l3.locked());
  439. }
  440. }
  441. {
  442. L0 l0;
  443. L0 l1;
  444. L2 l2;
  445. L0 l3;
  446. try
  447. {
  448. std::lock(l0, l1, l2, l3);
  449. assert(false);
  450. }
  451. catch (int)
  452. {
  453. assert(!l0.locked());
  454. assert(!l1.locked());
  455. assert(!l2.locked());
  456. assert(!l3.locked());
  457. }
  458. }
  459. {
  460. L0 l0;
  461. L2 l1;
  462. L0 l2;
  463. L0 l3;
  464. try
  465. {
  466. std::lock(l0, l1, l2, l3);
  467. assert(false);
  468. }
  469. catch (int)
  470. {
  471. assert(!l0.locked());
  472. assert(!l1.locked());
  473. assert(!l2.locked());
  474. assert(!l3.locked());
  475. }
  476. }
  477. {
  478. L2 l0;
  479. L0 l1;
  480. L0 l2;
  481. L0 l3;
  482. try
  483. {
  484. std::lock(l0, l1, l2, l3);
  485. assert(false);
  486. }
  487. catch (int)
  488. {
  489. assert(!l0.locked());
  490. assert(!l1.locked());
  491. assert(!l2.locked());
  492. assert(!l3.locked());
  493. }
  494. }
  495. #endif // TEST_HAS_NO_EXCEPTIONS
  496. #endif // TEST_STD_VER >= 11
  497. return 0;
  498. }