convert_move.pass.cpp revision bc8d3f97eb5c958007f2713238472e0c1c8fe02c
1//===----------------------------------------------------------------------===//
2//
3// ��������������������The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10// <tuple>
11
12// template <class... Types> class tuple;
13
14// template <class... UTypes> tuple(tuple<UTypes...>&& u);
15
16#include <tuple>
17#include <string>
18#include <memory>
19#include <cassert>
20
21struct B
22{
23    int id_;
24
25    explicit B(int i) : id_(i) {}
26
27    virtual ~B() {}
28};
29
30struct D
31    : B
32{
33    explicit D(int i) : B(i) {}
34};
35
36int main()
37{
38    {
39        typedef std::tuple<double> T0;
40        typedef std::tuple<int> T1;
41        T0 t0(2.5);
42        T1 t1 = std::move(t0);
43        assert(std::get<0>(t1) == 2);
44    }
45    {
46        typedef std::tuple<double, char> T0;
47        typedef std::tuple<int, int> T1;
48        T0 t0(2.5, '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<double, char, D> T0;
55        typedef std::tuple<int, int, B> T1;
56        T0 t0(2.5, '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<double, char, D&> T0;
65        typedef std::tuple<int, int, B&> T1;
66        T0 t0(2.5, '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<double, char, std::unique_ptr<D>> T0;
75        typedef std::tuple<int, int, std::unique_ptr<B>> T1;
76        T0 t0(2.5, '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