Sorry, I just noticed I hadn't actually filled in the changelog. It should say "Clear DECL_UNINSTANTIATED_TEMPLATE_FRIEND_P."
On Thu, Nov 23, 2023 at 11:54 PM Nathaniel Shead <nathanielosh...@gmail.com> wrote: > > Bootstrapped and regtested on x86_64-pc-linux-gnu. I don't have write > access. > > -- >8 -- > > Otherwise attempting to get the originating module declaration ICEs > because the DECL_CHAIN of an instantiated friend template is no longer > its context. > > PR c++/104234 > PR c++/112580 > > gcc/cp/ChangeLog: > > * pt.cc (tsubst_template_decl): > > gcc/testsuite/ChangeLog: > > * g++.dg/modules/pr104234.C: New test. > > Signed-off-by: Nathaniel Shead <nathanielosh...@gmail.com> > --- > gcc/cp/pt.cc | 2 ++ > gcc/testsuite/g++.dg/modules/pr104234.C | 16 ++++++++++++++++ > 2 files changed, 18 insertions(+) > create mode 100644 gcc/testsuite/g++.dg/modules/pr104234.C > > diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc > index ed681afb5d4..5e10a523e1a 100644 > --- a/gcc/cp/pt.cc > +++ b/gcc/cp/pt.cc > @@ -14789,6 +14789,8 @@ tsubst_template_decl (tree t, tree args, > tsubst_flags_t complain, > if (PRIMARY_TEMPLATE_P (t)) > DECL_PRIMARY_TEMPLATE (r) = r; > > + DECL_UNINSTANTIATED_TEMPLATE_FRIEND_P (r) = false; > + > if (!lambda_fntype && !class_p) > { > /* Record this non-type partial instantiation. */ > diff --git a/gcc/testsuite/g++.dg/modules/pr104234.C > b/gcc/testsuite/g++.dg/modules/pr104234.C > new file mode 100644 > index 00000000000..d81f0d435bc > --- /dev/null > +++ b/gcc/testsuite/g++.dg/modules/pr104234.C > @@ -0,0 +1,16 @@ > +// PR c++/104234 > +// { dg-additional-options "-fmodules-ts" } > + > +template <typename> struct _Node_handle_common { > + template <typename> friend class _Rb_tree; > +}; > +struct _Hashtable { > + using node_type = _Node_handle_common<int>; > + node_type __trans_tmp_1; > +}; > +template <typename> class _Rb_tree { > + struct _Rb_tree_impl { > + _Rb_tree_impl(); > + } _M_impl; > +}; > +_Rb_tree<int> _M_tmap_; > -- > 2.42.0 >