]> git.ipfire.org Git - thirdparty/gcc.git/commit
c++: fix rejects-valid and ICE with constexpr NSDMI [PR110822]
authorMarek Polacek <polacek@redhat.com>
Tue, 18 Feb 2025 17:18:31 +0000 (12:18 -0500)
committerMarek Polacek <polacek@redhat.com>
Fri, 28 Feb 2025 17:27:36 +0000 (12:27 -0500)
commit96572464234a88949ebfc07207ae2ae04c63e53b
tree69372dfd7b7b3cd414d25a733057a1b0c5368695
parent22018a4a8caa806a8f673eb0713de16d64d25063
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>
gcc/cp/constexpr.cc
gcc/testsuite/g++.dg/cpp0x/constexpr-nsdmi4.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp0x/constexpr-nsdmi5.C [new file with mode: 0644]