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.
