https://gcc.gnu.org/bugzilla/show_bug.cgi?id=126036
--- Comment #7 from GCC Commits <cvs-commit at gcc dot gnu.org> --- The master branch has been updated by Jakub Jelinek <[email protected]>: https://gcc.gnu.org/g:a55bba03ab13df7140bcf4edd97481e584687d00 commit r17-2126-ga55bba03ab13df7140bcf4edd97481e584687d00 Author: Jakub Jelinek <[email protected]> Date: Fri Jul 3 20:41:45 2026 +0200 c++: Fix up ICEs with some metafns with non-dependent args in templates [PR126036] The following testcase ICEs, because potential_constant_expression_1 handles some forms of CAST_EXPR, but cxx_eval_constant_expression doesn't. Normally, if we have e.g. a non-dependent compound literal in a template, finish_compound_literal will create a CAST_EXPR, but fold_non_dependent_expr_template -> instantiate_non_dependent_expr_internal will fold that away, so constexpr.cc evaluation doesn't see it. reflect.cc calls finish_compound_literal in 3 spots, one is to create std::array <type, 0> {}, another one is when creating the std::meta::exception object to throw and the last one when creating std::vector <std::meta::info> object to return from various metafns. If that is done with processing_template_decl, finish_compound_literal will again return a CAST_EXPR, but unlike the usual case it is during constant evaluation and so instantiate_non_dependent_expr_internal will not be invoked on it to clean that up. Now, in the get_meta_exception_object case, we already have /* Don't throw in a template. */ if (processing_template_decl) { *non_constant_p = true; return NULL_TREE; } This patch uses the same thing (i.e. avoid folding even non-dependent metafn calls that would need finish_compound_literal during processing_template_decl) to fix this. I think in both cases it is fine to defer the constant evaluation, the return type from those metafns is not dependent (std::meta::info in the reflect_constant_array case, std::vector <std::meta::info> otherwise). 2026-07-03 Jakub Jelinek <[email protected]> PR c++/126036 * reflect.cc (get_range_elts): Avoid calling finish_compound_literal when processing_template_decl, instead set *non_constant_p and return NULL_TREE. (process_metafunction): Likewise. * g++.dg/reflect/pr126036.C: New test. Reviewed-by: Jason Merrill <[email protected]>
