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