Skip to content
Snippets Groups Projects
Commit 96572464 authored by Marek Polacek's avatar Marek Polacek
Browse files

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: default avatarJason Merrill <jason@redhat.com>
parent 22018a4a
No related branches found
No related tags found
No related merge requests found
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment