[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]>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.