[Bug c++/126215] ICE constant not recomputed when 'ADDR_EXPR' changed
"cvs-commit at gcc dot gnu.org via Gcc-bugs" <[email protected]>
| Newsgroups | gmane.comp.gcc.bugs |
|---|---|
| Message-ID | <[email protected]/bugzilla/> |
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=126215 --- Comment #5 from GCC Commits <cvs-commit at gcc dot gnu.org> --- The trunk branch has been updated by Marek Polacek <[email protected]>: https://gcc.gnu.org/g:706c0877e818b1035b763863b227d4d928ade421 commit r17-2663-g706c0877e818b1035b763863b227d4d928ade421 Author: Marek Polacek <[email protected]> Date: Wed Jul 22 17:28:03 2026 -0400 c++: constant not recomputed when ADDR_EXPR changed [PR126215] Like in PR110822, the attached test produces an ICE in verify_address: error: constant not recomputed when 'ADDR_EXPR' changed since r10-7718, but it wasn't fixed by r15-7762. The reason is that here we have: {.D.3013={.D.3006={.a={.ptr=&<retval>.D.3013.D.3006.a}}, .D.3007={.b={.ptr=&<retval>.D.3013.D.3007.b}}}} and we replace '<retval>' with 'names', but we only call recompute_tree_invariant_expr for the first ADDR_EXPR, not the latter. For the second ADDR_EXPR d->changed will be false: the first replacement changed the shared tree <retval>.D.3013. In replace_placeholders_r we unshare_expr when replacing a PLACEHOLDER_EXPR, but we also replace PLACEHOLDER_EXPRs in lookup_placeholder which didn't have this unsharing. PR c++/126215 gcc/cp/ChangeLog: * constexpr.cc (lookup_placeholder): Do unshare_expr. gcc/testsuite/ChangeLog: * g++.dg/cpp1z/constexpr-nsdmi1.C: New test. Reviewed-by: Jason Merrill <[email protected]>