aboutsummaryrefslogtreecommitdiff
path: root/libgcc
diff options
context:
space:
mode:
authorPatrick Palka <ppalka@redhat.com>2024-07-17 21:02:52 -0400
committerPatrick Palka <ppalka@redhat.com>2024-07-17 21:02:52 -0400
commit30dd420a06ad7d2adf4a672d176caee632f8168a (patch)
tree1b8c65683f1430b9e4eb83a6f59135ae63a760cc /libgcc
parent93c54caa64fee2a0fa7251d214cdf639b8d7899f (diff)
downloadgcc-master.zip
gcc-master.tar.gz
gcc-master.tar.bz2
c++: prev declared hidden tmpl friend inst [PR112288]HEADtrunkmaster
When partially instantiating a previously declared hidden template friend definition (at class template scope) such as slot_allocated in the first testcase below, tsubst_friend_function needs to go through all existing specializations thereof and make them point to the new definition. But when the previous declaration was also at class template scope, old_decl is not the most general template, instead it's the partial instantiation, and since instantiations are relative to the most general template, old_decl's DECL_TEMPLATE_INSTANTIATIONS is empty. So we to consistently use the most general template here. And when adjusting DECL_TI_ARGS to match, only the innermost template arguments should be preserved; the outer ones should correspond to the new definition. Otherwise we fail a checking-only sanity check in instantiate_decl in the first testcase, and in the second/third we end up emitting multiple definitions of the template friend instantiation, resulting in a link failure. PR c++/112288 gcc/cp/ChangeLog: * pt.cc (tsubst_friend_function): When adjusting existing specializations after defining a previously declared template friend, consider the most general template and correct DECL_TI_ARGS adjustment. gcc/testsuite/ChangeLog: * g++.dg/template/friend80.C: New test. * g++.dg/template/friend81.C: New test. * g++.dg/template/friend81a.C: New test. Reviewed-by: Jason Merrill <jason@redhat.com>
Diffstat (limited to 'libgcc')
0 files changed, 0 insertions, 0 deletions