static constexpr size_t size() noexcept { return sizeof...(_Idx); }
};
+#if __glibcxx_integer_sequence >= 202511L // C++ >= 26
+ /** @brief Structured binding support for `integer_sequence`
+
+ * @since C++26
+ * @{
+ */
+ /// Structured binding support
+ template<typename _Tp, _Tp... _Idx>
+ struct tuple_size<integer_sequence<_Tp, _Idx...>>
+ : integral_constant<size_t, sizeof...(_Idx)> { };
+
+ template<size_t __i, class _Tp, _Tp... _Idx>
+ struct tuple_element<__i, integer_sequence<_Tp, _Idx...>>
+ {
+ static_assert(__i < sizeof...(_Idx));
+ using type = _Tp;
+ };
+
+ template<size_t __i, class _Tp, _Tp... _Idx>
+ struct tuple_element<__i, const integer_sequence<_Tp, _Idx...>>
+ {
+ static_assert(__i < sizeof...(_Idx));
+ using type = _Tp;
+ };
+
+ template<size_t __i, class _Tp, _Tp... _Idx>
+ [[nodiscard]]
+ constexpr _Tp
+ get(integer_sequence<_Tp, _Idx...>) noexcept
+ {
+ static_assert(__i < sizeof...(_Idx));
+ return _Idx...[__i];
+ }
+ /// @}
+#endif // __glibcxx_integer_sequence >= 202511L
+
/// Alias template make_integer_sequence
template<typename _Tp, _Tp _Num>
using make_integer_sequence
--- /dev/null
+// { 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() );
--- /dev/null
+// { dg-do compile { target c++26 } }
+
+#include <utility>
+
+using empty = std::integer_sequence<int>;
+static_assert( std::is_same_v<std::tuple_element_t<0, empty>, int> ); // { dg-error "here" }
+static_assert( std::is_same_v<std::tuple_element_t<0, const empty>, int> ); // { dg-error "here" }
+
+using size4 = std::integer_sequence<int, 1, 9, 7, 15>;
+static_assert( std::is_same_v<std::tuple_element_t<4, size4>, int> ); // { dg-error "here" }
+static_assert( std::is_same_v<std::tuple_element_t<4, const size4>, int> ); // { dg-error "here" }
+
+void
+test()
+{
+ (void)std::get<0>(empty{}); // { dg-error "here" }
+ (void)std::get<4>(size4{}); // { dg-error "here" }
+}
+
+// { dg-error "static assertion failed" "" { target *-*-* } 0 }
+// { dg-error "cannot index an empty pack" "" { target *-*-* } 0 }
+// { dg-error "pack index '.' is out of range for pack of length" "" { target *-*-* } 0 }