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 // tuple& operator=(const tuple& u); 15 16 // UNSUPPORTED: c++98, c++03 17 18 #include <tuple> 19 #include <memory> 20 #include <string> 21 #include <cassert> 22 23 #include "test_macros.h" 24 25 struct NonAssignable { 26 NonAssignable& operator=(NonAssignable const&) = delete; 27 NonAssignable& operator=(NonAssignable&&) = delete; 28 }; 29 struct CopyAssignable { 30 CopyAssignable& operator=(CopyAssignable const&) = default; 31 CopyAssignable& operator=(CopyAssignable &&) = delete; 32 }; 33 static_assert(std::is_copy_assignable<CopyAssignable>::value, ""); 34 struct MoveAssignable { 35 MoveAssignable& operator=(MoveAssignable const&) = delete; 36 MoveAssignable& operator=(MoveAssignable&&) = default; 37 }; 38 39 int main() 40 { 41 { 42 typedef std::tuple<> T; 43 T t0; 44 T t; 45 t = t0; 46 } 47 { 48 typedef std::tuple<int> T; 49 T t0(2); 50 T t; 51 t = t0; 52 assert(std::get<0>(t) == 2); 53 } 54 { 55 typedef std::tuple<int, char> T; 56 T t0(2, 'a'); 57 T t; 58 t = t0; 59 assert(std::get<0>(t) == 2); 60 assert(std::get<1>(t) == 'a'); 61 } 62 { 63 typedef std::tuple<int, char, std::string> T; 64 const T t0(2, 'a', "some text"); 65 T t; 66 t = t0; 67 assert(std::get<0>(t) == 2); 68 assert(std::get<1>(t) == 'a'); 69 assert(std::get<2>(t) == "some text"); 70 } 71 { 72 // test reference assignment. 73 using T = std::tuple<int&, int&&>; 74 int x = 42; 75 int y = 100; 76 int x2 = -1; 77 int y2 = 500; 78 T t(x, std::move(y)); 79 T t2(x2, std::move(y2)); 80 t = t2; 81 assert(std::get<0>(t) == x2); 82 assert(&std::get<0>(t) == &x); 83 assert(std::get<1>(t) == y2); 84 assert(&std::get<1>(t) == &y); 85 } 86 { 87 // test that the implicitly generated copy assignment operator 88 // is properly deleted 89 using T = std::tuple<std::unique_ptr<int>>; 90 static_assert(!std::is_copy_assignable<T>::value, ""); 91 } 92 { 93 using T = std::tuple<int, NonAssignable>; 94 static_assert(!std::is_copy_assignable<T>::value, ""); 95 } 96 { 97 using T = std::tuple<int, CopyAssignable>; 98 static_assert(std::is_copy_assignable<T>::value, ""); 99 } 100 { 101 using T = std::tuple<int, MoveAssignable>; 102 static_assert(!std::is_copy_assignable<T>::value, ""); 103 } 104 } 105