// P2662R3 - Pack Indexing // PR c++/113798 // { dg-do compile { target c++26 } } // Test invalid cases. template using Type = Typo...[I]; // { dg-error "does not name a type" } template constexpr auto Var = Typo...[I]; // { dg-error "no parameter packs" } template void foo(Ts...[]); // { dg-error "pack index missing" } template void f(Ts...[1]); template int f2 (X... [N]); // { dg-error "contains no parameter packs" } struct X; template struct TX; template typename Tp> void bad (int i) { i...[0]; // { dg-error "no parameter packs" } V...[0]; // { dg-error "no parameter packs" } X...[0] x; // { dg-error "no parameter packs" } T...[0] t; // { dg-error "no parameter packs" } Tp...[0] tp; // { dg-error "expected" } X...[0] xarr[1]; // { dg-error "no parameter packs" } T...[0] tarr[1]; // { dg-error "no parameter packs" } Tp...[0] tparr[1]; // { dg-error "expected" } } template int getT (auto... Ts) { return Ts...[N]; // { dg-error "cannot index an empty pack" } } template int getT2 (auto... Ts) { return Ts...[N]; // { dg-error "pack index is negative" } } template void badtype () { Ts...[N] t; // { dg-error "cannot index an empty pack" } } template void badtype2 () { Ts...[N] t; // { dg-error "pack index is out of range" } } template void badtype3 () { Ts...[N] t; // { dg-error "cannot index an empty pack" } } template void badtype4 () { Ts...[N] t; // { dg-error "pack index is negative" } } int nonconst () { return 42; } template void badindex () { Ts...[nonconst ()] t; // { dg-error "pack index is not an integral constant" } // { dg-error "non-.constexpr. function" "" { target *-*-* } .-1 } } template struct broken { Ts...1; // { dg-error "expected" } Ts...[; // { dg-error "invalid" } Ts...[1; // { dg-error "invalid" } Ts...[]; // { dg-error "pack index missing" } void foo (auto...Vs) { decltype(Vs...[1]) d1 = Vs...[]; // { dg-error "pack index missing" } decltype(Vs...[1]) d2 = Vs...[; // { dg-error "expected" } } }; int main() { // void f(int [1], double [1]) f(nullptr, nullptr); // { dg-error "no matching function" } bad(42); getT<0>(); // { dg-message "required from here" } getT<1>(); // { dg-message "required from here" } getT2<-1>(1); // { dg-message "required from here" } badtype<0>(); // { dg-message "required from here" } badtype2<1, int>(); // { dg-message "required from here" } badtype3<-1>(); // { dg-message "required from here" } badtype4<-1, int>(); // { dg-message "required from here" } badindex(); bool b = nothere...[0]; // { dg-error "no parameter packs" } using E = nothere...[0]; // { dg-error "does not name a type" } }