blob: afa644e7dab72b8e7cee3e9272c727b7901c02ce [file]
// { dg-do compile { target c++26 } }
#include <utility>
#include <tuple>
#include <testsuite_hooks.h>
#if __cpp_lib_integer_sequence < 202511L
# error "Feature-test macro __cpp_lib_integer_sequence is incorrect"
#endif
constexpr auto
destructure_sum(auto seq)
{
auto [...elems] = seq;
return (0 + ... + elems);
}
using IS1 = std::make_index_sequence<10>;
static_assert( std::tuple_size_v<IS1> == 10 );
static_assert( std::is_same_v<std::tuple_element_t<3, IS1>, std::size_t> );
static_assert( std::get<7>(IS1{}) == 7 );
static_assert( destructure_sum(IS1{}) == 45 );
static_assert( noexcept(get<0>(IS1{})) );
using IS2 = std::integer_sequence<int, 42, 101, -13>;
static_assert( std::tuple_size_v<IS2> == 3 );
static_assert( std::is_same_v<std::tuple_element_t<1, IS2>, int> );
static_assert( std::get<2>(IS2{}) == -13 );
static_assert( destructure_sum(IS2{}) == 130 );
static_assert( noexcept(get<0>(IS2{})) );
using IS3 = std::integer_sequence<char>;
static_assert( std::tuple_size_v<IS3> == 0 );
using IS4 = std::integer_sequence<int, 1, 2>;
static_assert( !std::is_constructible_v<std::pair<int, int>, IS4> );
static_assert( !std::is_constructible_v<std::tuple<int, int>, IS4> );
template<typename = void>
constexpr bool
test_basic()
{
{
auto [...elems] = std::make_index_sequence<0>{};
static_assert( sizeof...(elems) == 0 );
}
{
auto [...elems] = std::integer_sequence<int, 3, 5, 7, 11>{};
static_assert( sizeof...(elems) == 4 );
VERIFY( elems...[0] == 3 );
VERIFY( elems...[1] == 5 );
VERIFY( elems...[2] == 7 );
VERIFY( elems...[3] == 11 );
}
{
static constexpr auto [...elems] = std::integer_sequence<short, 2, 4, 8, 16>{};
static_assert( sizeof...(elems) == 4 );
static_assert( elems...[0] == 2 );
static_assert( elems...[1] == 4 );
static_assert( elems...[2] == 8 );
static_assert( elems...[3] == 16 );
}
{
constexpr auto [...elems] = std::integer_sequence<int, 1, 8, 2, 11>{};
static_assert( sizeof...(elems) == 4 );
static_assert( elems...[0] == 1 );
static_assert( elems...[1] == 8 );
static_assert( elems...[2] == 2 );
static_assert( elems...[3] == 11 );
}
{
static constexpr auto&& [...elems] = std::integer_sequence<short, 2, 4, 8, 16>{};
static_assert( sizeof...(elems) == 4 );
static_assert( elems...[0] == 2 );
static_assert( elems...[1] == 4 );
static_assert( elems...[2] == 8 );
static_assert( elems...[3] == 16 );
}
/* Unimplemented, see PR117784
{
constexpr auto&& [...elems] = std::integer_sequence<int, 1, 8, 2, 11>{};
static_assert( sizeof...(elems) == 4 );
static_assert( elems...[0] == 1 );
static_assert( elems...[1] == 8 );
static_assert( elems...[2] == 2 );
static_assert( elems...[3] == 11 );
}
*/
{
auto idx = 0;
static constexpr auto seq = std::make_index_sequence<4>{};
template for (constexpr auto elem : seq)
{
VERIFY( elem == idx );
++idx;
}
VERIFY( idx == 4 );
}
/* Unimplemented, see PR117784
{
auto idx = 0;
constexpr auto seq = std::make_index_sequence<4>{};
template for (constexpr auto elem : seq)
{
VERIFY( elem == idx );
++idx;
}
VERIFY( idx == 4 );
}
{
auto idx = 0;
template for (constexpr auto elem : std::make_index_sequence<4>{})
{
VERIFY( elem == idx );
++idx;
}
VERIFY( idx == 4 );
}
*/
return true;
}
static_assert( test_basic() );