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