https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87934
Jakub Jelinek <jakub at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |jakub at gcc dot gnu.org,
| |jason at gcc dot gnu.org
--- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
cxx_eval_constant_expression doesn't fold this, because {.bar=BAR} CONSTRUCTOR
is TREE_CONSTANT, but not reduced_constant_expression_p, as it contains the
CONST_DECL in it and we have:
4684 if (TREE_CONSTANT (t))
4685 {
4686 /* Don't re-process a constant CONSTRUCTOR, but do fold it to
4687 VECTOR_CST if applicable. */
4688 verify_constructor_flags (t);
4689 if (TREE_CONSTANT (t))
4690 return fold (t);
4691 }
4692 r = cxx_eval_bare_aggregate (ctx, t, lval,
4693 non_constant_p, overflow_p);
So, to fix this, we either need to make sure that the CONSTRUCTOR is cp_folded
when it is being created, or to check above reduced_constant_expression_p
instead of in addition to TREE_CONSTANT, or change fold in fold-const.c, so
that if it sees CONST_DECLs in there, they are folded too. But it would need
to do it recursively.
To me changing cxx_eval_const_expression looks easiest, but dunno if it is
correct thing to do.