convert_move.pass.cpp 2.5 KB

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