https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113834
--- Comment #6 from Jakub Jelinek <jakub at gcc dot gnu.org> --- (In reply to Marek Polacek from comment #5) > To fix the ICE we could do: > > --- a/gcc/cp/semantics.cc > +++ b/gcc/cp/semantics.cc > @@ -4644,7 +4644,9 @@ static tree > finish_type_pack_element (tree idx, tree types, tsubst_flags_t complain) > { > idx = maybe_constant_value (idx); > - if (TREE_CODE (idx) != INTEGER_CST || !INTEGRAL_TYPE_P (TREE_TYPE (idx))) > + if (TREE_CODE (idx) != INTEGER_CST > + || !INTEGRAL_TYPE_P (TREE_TYPE (idx)) > + || !tree_fits_shwi_p (idx)) > { > if (complain & tf_error) > error ("%<__type_pack_element%> index is not an integral constant"); But then the diagnostics is confusing. Perhaps use tree_int_cst_sgn (idx) < 0 instead of tree_to_shwi + val < 0, wi::to_widest (idx) >= TREE_VEC_LENGTH (types) for out of range and only use tree_to_shwi after those checks?