https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105268
--- Comment #2 from Marek Polacek <mpolacek at gcc dot gnu.org> --- Looks like we mistakenly parse C_many<int> as a placeholder-type-specifier, and things go wrong from there. For C_one<int> cp_parser_placeholder_type_specifier -> finish_type_constraints -> build_type_constraint -> build_concept_check -> build_standard_check -> coerce_template_parms -> coerce_template_parms fails here: 8916 nargs = inner_args ? NUM_TMPL_ARGS (inner_args) : 0; 8917 if ((nargs - variadic_args_p > nparms && !variadic_p) 8918 || (nargs < nparms - variadic_p 8919 && require_all_args 8920 && !variadic_args_p 8921 && (!use_default_args 8922 || (TREE_VEC_ELT (parms, nargs) != error_mark_node 8923 && !TREE_PURPOSE (TREE_VEC_ELT (parms, nargs)))))) 8924 { 8925 bad_nargs: but for C_many<int> variadic_p is true so we don't return error_mark_node but <type_argument_pack>.