convert_move.pass.cpp 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  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. // <tuple>
  10. // template <class... Types> class tuple;
  11. // template <class... UTypes>
  12. // tuple& operator=(tuple<UTypes...>&& u);
  13. // UNSUPPORTED: c++98, c++03
  14. #include <tuple>
  15. #include <string>
  16. #include <memory>
  17. #include <utility>
  18. #include <cassert>
  19. struct B
  20. {
  21. int id_;
  22. explicit B(int i= 0) : id_(i) {}
  23. virtual ~B() {}
  24. };
  25. struct D
  26. : B
  27. {
  28. explicit D(int i) : B(i) {}
  29. };
  30. int main()
  31. {
  32. {
  33. typedef std::tuple<double> T0;
  34. typedef std::tuple<int> T1;
  35. T0 t0(2.5);
  36. T1 t1;
  37. t1 = std::move(t0);
  38. assert(std::get<0>(t1) == 2);
  39. }
  40. {
  41. typedef std::tuple<double, char> T0;
  42. typedef std::tuple<int, int> T1;
  43. T0 t0(2.5, 'a');
  44. T1 t1;
  45. t1 = std::move(t0);
  46. assert(std::get<0>(t1) == 2);
  47. assert(std::get<1>(t1) == int('a'));
  48. }
  49. {
  50. typedef std::tuple<double, char, D> T0;
  51. typedef std::tuple<int, int, B> T1;
  52. T0 t0(2.5, 'a', D(3));
  53. T1 t1;
  54. t1 = std::move(t0);
  55. assert(std::get<0>(t1) == 2);
  56. assert(std::get<1>(t1) == int('a'));
  57. assert(std::get<2>(t1).id_ == 3);
  58. }
  59. {
  60. D d(3);
  61. D d2(2);
  62. typedef std::tuple<double, char, D&> T0;
  63. typedef std::tuple<int, int, B&> T1;
  64. T0 t0(2.5, 'a', d2);
  65. T1 t1(1.5, 'b', d);
  66. t1 = std::move(t0);
  67. assert(std::get<0>(t1) == 2);
  68. assert(std::get<1>(t1) == int('a'));
  69. assert(std::get<2>(t1).id_ == 2);
  70. }
  71. {
  72. typedef std::tuple<double, char, std::unique_ptr<D>> T0;
  73. typedef std::tuple<int, int, std::unique_ptr<B>> T1;
  74. T0 t0(2.5, 'a', std::unique_ptr<D>(new D(3)));
  75. T1 t1;
  76. t1 = std::move(t0);
  77. assert(std::get<0>(t1) == 2);
  78. assert(std::get<1>(t1) == int('a'));
  79. assert(std::get<2>(t1)->id_ == 3);
  80. }
  81. }