https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118169
Jakub Jelinek <jakub at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |jason at gcc dot gnu.org --- Comment #18 from Jakub Jelinek <jakub at gcc dot gnu.org> --- Maybe just special case VOID_TYPE_P in there? --- gcc/cp/constexpr.cc.jj 2025-01-02 11:47:10.290500486 +0100 +++ gcc/cp/constexpr.cc 2025-01-03 17:28:23.879757899 +0100 @@ -8870,14 +8870,17 @@ cxx_eval_outermost_constant_expr (tree t /* Turn off -frounding-math for manifestly constant evaluation. */ warning_sentinel rm (flag_rounding_math, ctx.manifestly_const_eval == mce_true); - tree type = (object - ? cv_unqualified (TREE_TYPE (object)) - : initialized_type (t)); + tree type = initialized_type (t); + if (object && !VOID_TYPE_P (type)) + type = cv_unqualified (TREE_TYPE (object)); tree r = t; bool is_consteval = false; if (VOID_TYPE_P (type)) { - if (!constexpr_dtor) + if (constexpr_dtor) + /* Used for destructors of array elements. */ + type = cv_unqualified (TREE_TYPE (object)); + else { if (cxx_dialect < cxx20) return t; is a partial reversion of that patch, which keeps previous behavior for the VOID_TYPE_P (initialized_type (t)) case (dunno about cv_unqualified vs. nothing for the dtors case) but still fixes the constexpr-prvalue{2,3}.C ICEs.