1bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===----------------------------------------------------------------------===// 2bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 3f5256e16dfc425c1d466f6308d4026d529ce9e0bHoward Hinnant// The LLVM Compiler Infrastructure 4bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 5b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open 6b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// Source Licenses. See LICENSE.TXT for details. 7bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 8bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===----------------------------------------------------------------------===// 9bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 10bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// <tuple> 11bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 12bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// template <class... Types> class tuple; 13bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 14bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// constexpr tuple(); 15bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 165cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert// UNSUPPORTED: c++98, c++03 175cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert 18bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <tuple> 19bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <string> 20bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <cassert> 217112dae6acac544a0271a85d95342c583441e2d1Dan Albert#include <type_traits> 22bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 23e27dbcf2dce3505a2c6f2d385216ea4e76655df3Marshall Clow#include "DefaultOnly.h" 24bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 257112dae6acac544a0271a85d95342c583441e2d1Dan Albertstruct NoDefault { 267112dae6acac544a0271a85d95342c583441e2d1Dan Albert NoDefault() = delete; 277112dae6acac544a0271a85d95342c583441e2d1Dan Albert explicit NoDefault(int) { } 287112dae6acac544a0271a85d95342c583441e2d1Dan Albert}; 297112dae6acac544a0271a85d95342c583441e2d1Dan Albert 307112dae6acac544a0271a85d95342c583441e2d1Dan Albertstruct NoExceptDefault { 317112dae6acac544a0271a85d95342c583441e2d1Dan Albert NoExceptDefault() noexcept = default; 327112dae6acac544a0271a85d95342c583441e2d1Dan Albert}; 337112dae6acac544a0271a85d95342c583441e2d1Dan Albert 347112dae6acac544a0271a85d95342c583441e2d1Dan Albertstruct ThrowingDefault { 357112dae6acac544a0271a85d95342c583441e2d1Dan Albert ThrowingDefault() { } 367112dae6acac544a0271a85d95342c583441e2d1Dan Albert}; 377112dae6acac544a0271a85d95342c583441e2d1Dan Albert 385cb52824fc2a0caf233311e91d9a2a53368f04adDan Albertstruct IllFormedDefault { 395cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert IllFormedDefault(int x) : value(x) {} 405cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert template <bool Pred = false> 415cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert constexpr IllFormedDefault() { 425cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert static_assert(Pred, 435cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert "The default constructor should not be instantiated"); 445cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert } 455cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert int value; 465cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert}; 475cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert 48bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint main() 49bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 50bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 51bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::tuple<> t; 52bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 53bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 54bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::tuple<int> t; 55bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(std::get<0>(t) == 0); 56bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 57bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 58bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::tuple<int, char*> t; 59bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(std::get<0>(t) == 0); 60bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(std::get<1>(t) == nullptr); 61bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 62bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 63bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::tuple<int, char*, std::string> t; 64bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(std::get<0>(t) == 0); 65bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(std::get<1>(t) == nullptr); 66bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(std::get<2>(t) == ""); 67bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 68bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 69bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::tuple<int, char*, std::string, DefaultOnly> t; 70bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(std::get<0>(t) == 0); 71bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(std::get<1>(t) == nullptr); 72bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(std::get<2>(t) == ""); 73bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(std::get<3>(t) == DefaultOnly()); 74bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 757112dae6acac544a0271a85d95342c583441e2d1Dan Albert { 767112dae6acac544a0271a85d95342c583441e2d1Dan Albert // See bug #21157. 777112dae6acac544a0271a85d95342c583441e2d1Dan Albert static_assert(!std::is_default_constructible<std::tuple<NoDefault>>(), ""); 787112dae6acac544a0271a85d95342c583441e2d1Dan Albert static_assert(!std::is_default_constructible<std::tuple<DefaultOnly, NoDefault>>(), ""); 797112dae6acac544a0271a85d95342c583441e2d1Dan Albert static_assert(!std::is_default_constructible<std::tuple<NoDefault, DefaultOnly, NoDefault>>(), ""); 807112dae6acac544a0271a85d95342c583441e2d1Dan Albert } 817112dae6acac544a0271a85d95342c583441e2d1Dan Albert { 827112dae6acac544a0271a85d95342c583441e2d1Dan Albert static_assert(noexcept(std::tuple<NoExceptDefault>()), ""); 837112dae6acac544a0271a85d95342c583441e2d1Dan Albert static_assert(noexcept(std::tuple<NoExceptDefault, NoExceptDefault>()), ""); 847112dae6acac544a0271a85d95342c583441e2d1Dan Albert 857112dae6acac544a0271a85d95342c583441e2d1Dan Albert static_assert(!noexcept(std::tuple<ThrowingDefault, NoExceptDefault>()), ""); 867112dae6acac544a0271a85d95342c583441e2d1Dan Albert static_assert(!noexcept(std::tuple<NoExceptDefault, ThrowingDefault>()), ""); 877112dae6acac544a0271a85d95342c583441e2d1Dan Albert static_assert(!noexcept(std::tuple<ThrowingDefault, ThrowingDefault>()), ""); 887112dae6acac544a0271a85d95342c583441e2d1Dan Albert } 895394c1ed302f924bddddd87bffac19292efb099cHoward Hinnant#ifndef _LIBCPP_HAS_NO_CONSTEXPR 905394c1ed302f924bddddd87bffac19292efb099cHoward Hinnant { 915394c1ed302f924bddddd87bffac19292efb099cHoward Hinnant constexpr std::tuple<> t; 925394c1ed302f924bddddd87bffac19292efb099cHoward Hinnant } 935394c1ed302f924bddddd87bffac19292efb099cHoward Hinnant { 945394c1ed302f924bddddd87bffac19292efb099cHoward Hinnant constexpr std::tuple<int> t; 955394c1ed302f924bddddd87bffac19292efb099cHoward Hinnant assert(std::get<0>(t) == 0); 965394c1ed302f924bddddd87bffac19292efb099cHoward Hinnant } 975394c1ed302f924bddddd87bffac19292efb099cHoward Hinnant { 985394c1ed302f924bddddd87bffac19292efb099cHoward Hinnant constexpr std::tuple<int, char*> t; 995394c1ed302f924bddddd87bffac19292efb099cHoward Hinnant assert(std::get<0>(t) == 0); 1005394c1ed302f924bddddd87bffac19292efb099cHoward Hinnant assert(std::get<1>(t) == nullptr); 1015394c1ed302f924bddddd87bffac19292efb099cHoward Hinnant } 1025cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert { 1035cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert // Check that the SFINAE on the default constructor is not evaluted when 1045cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert // it isn't needed. If the default constructor is evaluted then this test 1055cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert // should fail to compile. 1065cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert IllFormedDefault v(0); 1075cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert std::tuple<IllFormedDefault> t(v); 1085cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert } 1095394c1ed302f924bddddd87bffac19292efb099cHoward Hinnant#endif 110bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 111