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 // constexpr tuple(); 15 16 #include <tuple> 17 #include <string> 18 #include <cassert> 19 #include <type_traits> 20 21 #include "DefaultOnly.h" 22 23 struct NoDefault { 24 NoDefault() = delete; 25 explicit NoDefault(int) { } 26 }; 27 28 struct NoExceptDefault { 29 NoExceptDefault() noexcept = default; 30 }; 31 32 struct ThrowingDefault { 33 ThrowingDefault() { } 34 }; 35 36 int main() 37 { 38 { 39 std::tuple<> t; 40 } 41 { 42 std::tuple<int> t; 43 assert(std::get<0>(t) == 0); 44 } 45 { 46 std::tuple<int, char*> t; 47 assert(std::get<0>(t) == 0); 48 assert(std::get<1>(t) == nullptr); 49 } 50 { 51 std::tuple<int, char*, std::string> t; 52 assert(std::get<0>(t) == 0); 53 assert(std::get<1>(t) == nullptr); 54 assert(std::get<2>(t) == ""); 55 } 56 { 57 std::tuple<int, char*, std::string, DefaultOnly> t; 58 assert(std::get<0>(t) == 0); 59 assert(std::get<1>(t) == nullptr); 60 assert(std::get<2>(t) == ""); 61 assert(std::get<3>(t) == DefaultOnly()); 62 } 63 { 64 // See bug #21157. 65 static_assert(!std::is_default_constructible<std::tuple<NoDefault>>(), ""); 66 static_assert(!std::is_default_constructible<std::tuple<DefaultOnly, NoDefault>>(), ""); 67 static_assert(!std::is_default_constructible<std::tuple<NoDefault, DefaultOnly, NoDefault>>(), ""); 68 } 69 { 70 static_assert(noexcept(std::tuple<NoExceptDefault>()), ""); 71 static_assert(noexcept(std::tuple<NoExceptDefault, NoExceptDefault>()), ""); 72 73 static_assert(!noexcept(std::tuple<ThrowingDefault, NoExceptDefault>()), ""); 74 static_assert(!noexcept(std::tuple<NoExceptDefault, ThrowingDefault>()), ""); 75 static_assert(!noexcept(std::tuple<ThrowingDefault, ThrowingDefault>()), ""); 76 } 77 #ifndef _LIBCPP_HAS_NO_CONSTEXPR 78 { 79 constexpr std::tuple<> t; 80 } 81 { 82 constexpr std::tuple<int> t; 83 assert(std::get<0>(t) == 0); 84 } 85 { 86 constexpr std::tuple<int, char*> t; 87 assert(std::get<0>(t) == 0); 88 assert(std::get<1>(t) == nullptr); 89 } 90 #endif 91 } 92