c++: fix rejects-valid and ICE with constexpr NSDMI [PR110822]
Since r10-7718 the attached tests produce an ICE in verify_address:
error: constant not recomputed when 'ADDR_EXPR' changed
but before that we wrongly rejected the tests with "is not a constant
expression". This patch fixes both problems.
Since r10-7718 replace_decl_r can replace
{._M_dataplus=&<retval>._M_local_buf, ._M_local_buf=0}
with
{._M_dataplus=&HelloWorld._M_local_buf, ._M_local_buf=0}
The initial &<retval>._M_local_buf was not constant, but since
HelloWorld is a static VAR_DECL, the resulting &HelloWorld._M_local_buf
should have been marked as TREE_CONSTANT. And since we're taking
its address, the whole thing should be TREE_ADDRESSABLE.
PR c++/114913
PR c++/110822
gcc/cp/ChangeLog:
* constexpr.cc (replace_decl_r): If we've replaced something
inside of an ADDR_EXPR, call cxx_mark_addressable and
recompute_tree_invariant_for_addr_expr on the resulting ADDR_EXPR.
gcc/testsuite/ChangeLog:
* g++.dg/cpp0x/constexpr-nsdmi4.C: New test.
* g++.dg/cpp0x/constexpr-nsdmi5.C: New test.
Reviewed-by:
Jason Merrill <jason@redhat.com>
Showing
- gcc/cp/constexpr.cc 20 additions, 1 deletiongcc/cp/constexpr.cc
- gcc/testsuite/g++.dg/cpp0x/constexpr-nsdmi4.C 19 additions, 0 deletionsgcc/testsuite/g++.dg/cpp0x/constexpr-nsdmi4.C
- gcc/testsuite/g++.dg/cpp0x/constexpr-nsdmi5.C 15 additions, 0 deletionsgcc/testsuite/g++.dg/cpp0x/constexpr-nsdmi5.C
Loading
Please register or sign in to comment