On Wed, 9 Jun 2021, Patrick Palka wrote: > During deduction, when the template of a BOUND_TEMPLATE_TEMPLATE_PARM is
Ah sorry, this should instead say "when the template of _the argument for_ a BOUND_TEMPLATE_TEMPLATE_PARM is ..." > a template template parameter, we need to consider the > TEMPLATE_TEMPLATE_PARAMETER rather than the TEMPLATE_DECL thereof, > because the canonical form of a template template parameter in a > template argument list is the TEMPLATE_TEMPLATE_PARAMETER tree. > > Bootstrapped and regtested on x86_64-pc-linux-gnu, does this look OK for > trunk? > > PR c++/67829 > > gcc/cp/ChangeLog: > > * pt.c (unify) <case BOUND_TEMPLATE_TEMPLATE_PARM>: When > the TEMPLATE_DECL of a BOUND_TEMPLATE_TEMPLATE_PARM argument is > a template template parameter, adjust to the > TEMPLATE_TEMPLATE_PARAMETER before falling through. > > gcc/testsuite/ChangeLog: > > * g++.dg/template/ttp34.C: New test. > * g++.dg/template/ttp34a.C: New test. > * g++.dg/template/ttp34b.C: New test. > --- > gcc/cp/pt.c | 4 ++++ > gcc/testsuite/g++.dg/template/ttp34.C | 14 ++++++++++++++ > gcc/testsuite/g++.dg/template/ttp34a.C | 14 ++++++++++++++ > gcc/testsuite/g++.dg/template/ttp34b.C | 14 ++++++++++++++ > 4 files changed, 46 insertions(+) > create mode 100644 gcc/testsuite/g++.dg/template/ttp34.C > create mode 100644 gcc/testsuite/g++.dg/template/ttp34a.C > create mode 100644 gcc/testsuite/g++.dg/template/ttp34b.C > > diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c > index 05679b12973..963a182b9e5 100644 > --- a/gcc/cp/pt.c > +++ b/gcc/cp/pt.c > @@ -23555,6 +23555,10 @@ unify (tree tparms, tree targs, tree parm, tree arg, > int strict, > return 1; > > arg = TYPE_TI_TEMPLATE (arg); > + if (TREE_CODE (TREE_TYPE (arg)) == TEMPLATE_TEMPLATE_PARM) > + /* If the template is a template template parameter, use the > + TEMPLATE_TEMPLATE_PARM for matching. */ > + arg = TREE_TYPE (arg); > > /* Fall through to deduce template name. */ > } > diff --git a/gcc/testsuite/g++.dg/template/ttp34.C > b/gcc/testsuite/g++.dg/template/ttp34.C > new file mode 100644 > index 00000000000..67094063ba5 > --- /dev/null > +++ b/gcc/testsuite/g++.dg/template/ttp34.C > @@ -0,0 +1,14 @@ > +// PR c++/67829 > + > +template<class> class Purr; > + > +template<template<class> class, class, class> > +class Meow; > + > +template<template<class> class P> > +class Meow<P, P<int>, int> { }; // 1 > + > +template<template<class> class P, class T> > +class Meow<P, P<int>, T>; // 2 > + > +Meow<Purr, Purr<int>, int> kitty; > diff --git a/gcc/testsuite/g++.dg/template/ttp34a.C > b/gcc/testsuite/g++.dg/template/ttp34a.C > new file mode 100644 > index 00000000000..e3303dcf212 > --- /dev/null > +++ b/gcc/testsuite/g++.dg/template/ttp34a.C > @@ -0,0 +1,14 @@ > +// PR c++/67829 > + > +template<class> class Purr; > + > +template<template<class> class, class> > +class Meow; > + > +template<template<class> class P> > +class Meow<P, P<int> > { }; // 1 > + > +template<template<class> class P, class T> > +class Meow<P, P<T> >; // 2 > + > +Meow<Purr, Purr<int> > kitty; > diff --git a/gcc/testsuite/g++.dg/template/ttp34b.C > b/gcc/testsuite/g++.dg/template/ttp34b.C > new file mode 100644 > index 00000000000..ed3b3e8ab05 > --- /dev/null > +++ b/gcc/testsuite/g++.dg/template/ttp34b.C > @@ -0,0 +1,14 @@ > +// PR c++/67829 > + > +template<class> class Purr; > + > +template<class, template<class> class> > +class Meow; > + > +template<template<class> class P> > +class Meow<P<int>, P> { }; // 1 > + > +template<template<class> class P, class T> > +class Meow<P<T>, P>; // 2 > + > +Meow<Purr<int>, Purr> kitty; > -- > 2.32.0.rc2 > >