convert_move.pass.cpp 2.1 KB

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