On Wed, Jan 24, 2018 at 6:22 PM, Jakub Jelinek <ja...@redhat.com> wrote: > Hi! > > cxx_eval_outermost_constant_expr clears TREE_CONSTANT on ADDR_EXPRs that > aren't considered by C++ constant expressions, but that breaks middle-end > which relies on TREE_CONSTANT being set on ADDR_EXPR where the address > is constant. > > The following patch just special cases ADDR_EXPR not to clear it. > > Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? > > As I wrote in the PR, another option would be to restore TREE_CONSTANT > during genericization if it was cleared earlier in the FE. > > 2018-01-24 Jakub Jelinek <ja...@redhat.com> > > PR c++/83993 > * constexpr.c (cxx_eval_outermost_constant_expr): Don't clear > TREE_CONSTANT on ADDR_EXPRs. > > * g++.dg/init/pr83993-2.C: New test. > > --- gcc/cp/constexpr.c.jj 2018-01-24 13:38:40.572913190 +0100 > +++ gcc/cp/constexpr.c 2018-01-24 17:03:16.821440047 +0100 > @@ -4832,7 +4832,7 @@ cxx_eval_outermost_constant_expr (tree t > > if (non_constant_p && !allow_non_constant) > return error_mark_node; > - else if (non_constant_p && TREE_CONSTANT (r)) > + else if (non_constant_p && TREE_CONSTANT (r) && TREE_CODE (r) != ADDR_EXPR) > { > /* This isn't actually constant, so unset TREE_CONSTANT. */ > if (EXPR_P (r))
Hmm, what if we check for ADDR_EXPR in the EXPR_P test, so we build a non-TREE_CONSTANT NOP_EXPR around the ADDR_EXPR instead? Jason