tree pack = PACK_INDEX_PACK (t);
if (PACK_EXPANSION_P (pack))
pack = tsubst_pack_expansion (pack, args, complain, in_decl);
+ if (TREE_CODE (pack) == TREE_VEC && TREE_VEC_LENGTH (pack) == 0)
+ {
+ if (complain & tf_error)
+ error ("cannot index an empty pack");
+ return error_mark_node;
+ }
tree index = tsubst_expr (PACK_INDEX_INDEX (t), args, complain, in_decl);
const bool parenthesized_p = (TREE_CODE (t) == PACK_INDEX_EXPR
&& PACK_INDEX_PARENTHESIZED_P (t));
int
getT (auto... Ts)
{
- return Ts...[N]; // { dg-error "pack index is out of range" }
+ return Ts...[N]; // { dg-error "cannot index an empty pack" }
}
template<int N>
void
badtype ()
{
- Ts...[N] t; // { dg-error "pack index is out of range" }
+ Ts...[N] t; // { dg-error "cannot index an empty pack" }
}
template<auto N, typename... Ts>
void
badtype2 ()
+{
+ Ts...[N] t; // { dg-error "pack index is out of range" }
+}
+
+template<auto N, typename... Ts>
+void
+badtype3 ()
+{
+ Ts...[N] t; // { dg-error "cannot index an empty pack" }
+}
+
+template<auto N, typename... Ts>
+void
+badtype4 ()
{
Ts...[N] t; // { dg-error "pack index is negative" }
}
getT<0>(); // { dg-message "required from here" }
getT<1>(); // { dg-message "required from here" }
- getT2<-1>(); // { dg-message "required from here" }
+ getT2<-1>(1); // { dg-message "required from here" }
badtype<0>(); // { dg-message "required from here" }
- badtype<1, int>(); // { dg-message "required from here" }
- badtype2<-1>(); // { dg-message "required from here" }
- badtype2<-1, int>(); // { 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<int, int, int>();