blob: e8c7a90ae58f6b0e318f1220d4ff0b48d7848eca [file] [log] [blame]
// P2662R3 - Pack Indexing
// PR c++/113798
// { dg-do compile { target c++17 } }
// { dg-options "" }
template<class, class> struct same_type;
template<class T> struct same_type<T, T> {};
template<int I, typename... Ts>
using Type = Ts...[I]; // { dg-warning "pack indexing only available with" "" { target c++23_down } }
template<int I, auto... Ts>
constexpr auto Var = Ts...[I]; // { dg-warning "pack indexing only available with" "" { target c++23_down } }
template <int I, auto...Ts>
int
foo ()
{
return Ts...[I]; // { dg-warning "pack indexing only available with" "" { target c++23_down } }
}
template<typename... Ts>
struct S {
Ts...[0] a; // { dg-warning "pack indexing only available with" "" { target c++23_down } }
#if __cpp_concepts >= 201907L
void foo (auto... Vs) {
decltype(Vs...[1]) d1 = Vs...[1]; // { dg-warning "pack indexing only available with" "" { target { c++20 && c++23_down } } }
}
#endif
};
int
g ()
{
using U = Type<1, char, int, float>;
using U = int;
constexpr auto V = Var<2, 0, 1, 42>;
static_assert (V == 42);
U r = foo<2, 0, 1, 42>();
return r;
}
void
fn1 ()
{
int i = 0;
[&i](auto... pack) {
// type is int
decltype(pack...[0]) x5 = 42; // { dg-warning "pack indexing only available with" "" { target c++23_down } }
// type is int&
[[maybe_unused]] decltype((pack...[0])) x6 = i; // { dg-warning "pack indexing only available with" "" { target c++23_down } }
}(0);
}
#if __cpp_concepts >= 201907L
int
bar (auto... pack)
{
(void) pack...[0]; // { dg-warning "pack indexing only available with" "" { target { c++20 && c++23_down } } }
int x = pack...[0]; // { dg-warning "pack indexing only available with" "" { target { c++20 && c++23_down } } }
return x;
}
#endif
template<auto...pack>
void
fn2 ()
{
[[maybe_unused]] decltype(pack...[0]) x1; // { dg-warning "pack indexing only available with" "" { target c++23_down } }
[[maybe_unused]] decltype((pack...[0])) x2; // { dg-warning "pack indexing only available with" "" { target c++23_down } }
same_type<decltype(x1), int>();
same_type<decltype(x2), int>();
}
template<typename... T>
void
fn3 (int p)
{
T...[0] a = p; // { dg-warning "pack indexing only available with" "" { target c++23_down } }
(T...[0])(a); // { dg-warning "pack indexing only available with" "" { target c++23_down } }
}
template<int... Is>
void fn4 ()
{
same_type<decltype(Is...[0]), int>(); // { dg-warning "pack indexing only available with" "" { target c++23_down } }
same_type<decltype((Is...[0])), int>(); // { dg-warning "pack indexing only available with" "" { target c++23_down } }
}
void
g3 ()
{
fn2<0>();
#if __cpp_concepts >= 201907L
bar (0);
#endif
S<int> s;
fn4<0, 1, 2>();
}