move_ctor_pass.cpp 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  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(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 m;
  23. int main()
  24. {
  25. #if defined BOOST_THREAD_PROVIDES_FUTURE_CTOR_ALLOCATORS
  26. BOOST_TEST(test_alloc_base::count == 0);
  27. {
  28. boost::promise<int> p0(boost::allocator_arg, test_allocator<int>());
  29. boost::promise<int> p(boost::move(p0));
  30. BOOST_TEST(test_alloc_base::count == 1);
  31. std::cout << __LINE__ << std::endl;
  32. boost::future<int> f = BOOST_THREAD_MAKE_RV_REF(p.get_future());
  33. std::cout << __LINE__ << std::endl;
  34. BOOST_TEST(test_alloc_base::count == 1);
  35. BOOST_TEST(f.valid());
  36. std::cout << __LINE__ << std::endl;
  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. std::cout << __LINE__ << std::endl;
  47. BOOST_TEST(test_alloc_base::count == 1);
  48. }
  49. std::cout << __LINE__ << std::endl;
  50. BOOST_TEST(test_alloc_base::count == 0);
  51. {
  52. boost::promise<int&> p0(boost::allocator_arg, test_allocator<int>());
  53. boost::promise<int&> 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::move(p0));
  73. BOOST_TEST(test_alloc_base::count == 1);
  74. boost::future<void> f = BOOST_THREAD_MAKE_RV_REF(p.get_future());
  75. BOOST_TEST(test_alloc_base::count == 1);
  76. BOOST_TEST(f.valid());
  77. try
  78. {
  79. f = BOOST_THREAD_MAKE_RV_REF(p0.get_future());
  80. BOOST_TEST(false);
  81. }
  82. catch (const boost::future_error& e)
  83. {
  84. BOOST_TEST(e.code() == boost::system::make_error_code(boost::future_errc::no_state));
  85. }
  86. BOOST_TEST(test_alloc_base::count == 1);
  87. }
  88. BOOST_TEST(test_alloc_base::count == 0);
  89. #endif
  90. {
  91. boost::promise<int> p0;
  92. boost::promise<int> p(boost::move(p0));
  93. std::cout << __LINE__ << std::endl;
  94. boost::future<int> f = BOOST_THREAD_MAKE_RV_REF(p.get_future());
  95. std::cout << __LINE__ << std::endl;
  96. BOOST_TEST(f.valid());
  97. std::cout << __LINE__ << std::endl;
  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. std::cout << __LINE__ << std::endl;
  108. }
  109. std::cout << __LINE__ << std::endl;
  110. {
  111. boost::promise<int&> p0;
  112. boost::promise<int&> p(boost::move(p0));
  113. boost::future<int&> f = BOOST_THREAD_MAKE_RV_REF(p.get_future());
  114. BOOST_TEST(f.valid());
  115. try
  116. {
  117. f = BOOST_THREAD_MAKE_RV_REF(p0.get_future());
  118. BOOST_TEST(false);
  119. }
  120. catch (const boost::future_error& e)
  121. {
  122. BOOST_TEST(e.code() == boost::system::make_error_code(boost::future_errc::no_state));
  123. }
  124. }
  125. {
  126. boost::promise<void> p0;
  127. boost::promise<void> 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. }