https://gcc.gnu.org/bugzilla/show_bug.cgi?id=124306

--- Comment #4 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Jakub Jelinek <[email protected]>:

https://gcc.gnu.org/g:4a2d9d886ea03ad83e86dfc48df5351c22715722

commit r16-7869-g4a2d9d886ea03ad83e86dfc48df5351c22715722
Author: Jakub Jelinek <[email protected]>
Date:   Tue Mar 3 15:44:19 2026 +0100

    c++: Set OLD_PARM_DECL_P even in regenerate_decl_from_template [PR124306]

    The following testcase ICEs, because we try to instantiate the PARM_DECLs
    of foo <int> twice, once when parsing ^^foo <int> and remember in a
    REFLECT_EXPR a PARM_DECL in there, later on regenerate_decl_from_template
    is called and creates new set of PARM_DECLs and changes DECL_ARGUMENTS
    (or something later on in that chain) to the new set.
    This means when we call parameters_of on ^^foo <int> later on, they won't
    compare equal to the earlier acquired ones, and when we do e.g. type_of
    or other operation on the old PARM_DECL where it needs to search the
    DECL_ARGUMENTS (DECL_CONTEXT (parm_decl)) list, it will ICE because it
    won't find it there.

    The following patch fixes it similarly to how duplicate_decls deals
    with those, by setting OLD_PARM_DECL_P flag on the old PARM_DECLs, so that
    before using reflections of those we search DECL_ARGUMENTS and find the
    corresponding new PARM_DECL.

    2026-03-03  Jakub Jelinek  <[email protected]>

            PR c++/124306
            * pt.cc (regenerate_decl_from_template): Mark the old PARM_DECLs
            replaced with tsubst_decl result with OLD_PARM_DECL_P flag.

            * g++.dg/reflect/parameters_of8.C: New test.

Reply via email to