move_assign_pass.cpp 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. //===----------------------------------------------------------------------===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is dual licensed under the MIT and the University of Illinois Open
  6. // Source Licenses. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. // Copyright (C) 2011 Vicente J. Botet Escriba
  10. //
  11. // Distributed under the Boost Software License, Version 1.0. (See accompanying
  12. // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  13. // <future>
  14. // class promise<R>
  15. // promise& operator=(promise&& rhs);
  16. #define BOOST_THREAD_VERSION 3
  17. #include <boost/thread/future.hpp>
  18. #include <boost/detail/lightweight_test.hpp>
  19. #if defined BOOST_THREAD_PROVIDES_FUTURE_CTOR_ALLOCATORS
  20. #include "../test_allocator.hpp"
  21. #endif
  22. boost::mutex m0;
  23. boost::mutex m1;
  24. int main()
  25. {
  26. #if defined BOOST_THREAD_PROVIDES_FUTURE_CTOR_ALLOCATORS
  27. BOOST_TEST(test_alloc_base::count == 0);
  28. {
  29. boost::promise<int> p0(boost::allocator_arg, test_allocator<int>());
  30. boost::promise<int> p(boost::allocator_arg, test_allocator<int>());
  31. BOOST_TEST(test_alloc_base::count == 2);
  32. p = boost::move(p0);
  33. BOOST_TEST(test_alloc_base::count == 1);
  34. boost::future<int> f = BOOST_THREAD_MAKE_RV_REF(p.get_future());
  35. BOOST_TEST(test_alloc_base::count == 1);
  36. BOOST_TEST(f.valid());
  37. try
  38. {
  39. f = BOOST_THREAD_MAKE_RV_REF(p0.get_future());
  40. BOOST_TEST(false);
  41. }
  42. catch (const boost::future_error& e)
  43. {
  44. BOOST_TEST(e.code() == boost::system::make_error_code(boost::future_errc::no_state));
  45. }
  46. BOOST_TEST(test_alloc_base::count == 1);
  47. }
  48. BOOST_TEST(test_alloc_base::count == 0);
  49. {
  50. boost::promise<int&> p0(boost::allocator_arg, test_allocator<int>());
  51. boost::promise<int&> p(boost::allocator_arg, test_allocator<int>());
  52. BOOST_TEST(test_alloc_base::count == 2);
  53. p = boost::move(p0);
  54. BOOST_TEST(test_alloc_base::count == 1);
  55. boost::future<int&> f = BOOST_THREAD_MAKE_RV_REF(p.get_future());
  56. BOOST_TEST(test_alloc_base::count == 1);
  57. BOOST_TEST(f.valid());
  58. try
  59. {
  60. f = BOOST_THREAD_MAKE_RV_REF(p0.get_future());
  61. BOOST_TEST(false);
  62. }
  63. catch (const boost::future_error& e)
  64. {
  65. BOOST_TEST(e.code() == boost::system::make_error_code(boost::future_errc::no_state));
  66. }
  67. BOOST_TEST(test_alloc_base::count == 1);
  68. }
  69. BOOST_TEST(test_alloc_base::count == 0);
  70. {
  71. boost::promise<void> p0(boost::allocator_arg, test_allocator<void>());
  72. boost::promise<void> p(boost::allocator_arg, test_allocator<void>());
  73. BOOST_TEST(test_alloc_base::count == 2);
  74. p = boost::move(p0);
  75. BOOST_TEST(test_alloc_base::count == 1);
  76. boost::future<void> f = BOOST_THREAD_MAKE_RV_REF(p.get_future());
  77. BOOST_TEST(test_alloc_base::count == 1);
  78. BOOST_TEST(f.valid());
  79. try
  80. {
  81. f = BOOST_THREAD_MAKE_RV_REF(p0.get_future());
  82. BOOST_TEST(false);
  83. }
  84. catch (const boost::future_error& e)
  85. {
  86. BOOST_TEST(e.code() == boost::system::make_error_code(boost::future_errc::no_state));
  87. }
  88. BOOST_TEST(test_alloc_base::count == 1);
  89. }
  90. BOOST_TEST(test_alloc_base::count == 0);
  91. #endif
  92. {
  93. boost::promise<int> p0;
  94. boost::promise<int> p;
  95. p = boost::move(p0);
  96. boost::future<int> f = BOOST_THREAD_MAKE_RV_REF(p.get_future());
  97. BOOST_TEST(f.valid());
  98. try
  99. {
  100. f = BOOST_THREAD_MAKE_RV_REF(p0.get_future());
  101. BOOST_TEST(false);
  102. }
  103. catch (const boost::future_error& e)
  104. {
  105. BOOST_TEST(e.code() == boost::system::make_error_code(boost::future_errc::no_state));
  106. }
  107. }
  108. {
  109. boost::promise<int&> p0;
  110. boost::promise<int&> p;
  111. p = boost::move(p0);
  112. boost::future<int&> f = BOOST_THREAD_MAKE_RV_REF(p.get_future());
  113. BOOST_TEST(f.valid());
  114. try
  115. {
  116. f = BOOST_THREAD_MAKE_RV_REF(p0.get_future());
  117. BOOST_TEST(false);
  118. }
  119. catch (const boost::future_error& e)
  120. {
  121. BOOST_TEST(e.code() == boost::system::make_error_code(boost::future_errc::no_state));
  122. }
  123. }
  124. {
  125. boost::promise<void> p0;
  126. boost::promise<void> p;
  127. p = boost::move(p0);
  128. boost::future<void> f = BOOST_THREAD_MAKE_RV_REF(p.get_future());
  129. BOOST_TEST(f.valid());
  130. try
  131. {
  132. f = BOOST_THREAD_MAKE_RV_REF(p0.get_future());
  133. BOOST_TEST(false);
  134. }
  135. catch (const boost::future_error& e)
  136. {
  137. BOOST_TEST(e.code() == boost::system::make_error_code(boost::future_errc::no_state));
  138. }
  139. }
  140. return boost::report_errors();
  141. }