From: Patrick Palka Date: Thu, 10 Jun 2021 22:31:21 +0000 (-0400) Subject: c++: matching deduced template template parameters [PR67829] X-Git-Tag: upstream/12.2.0~7323 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=edec2660ff4890ecf8cc191f7c92cf527de51fe2;p=platform%2Fupstream%2Fgcc.git c++: matching deduced template template parameters [PR67829] During deduction, when the template of the argument for a bound ttp is a template template parameter, we need to consider the TEMPLATE_TEMPLATE_PARAMETER for matching rather than the TEMPLATE_DECL thereof, because the canonical form of a template template parameter as a template argument is the former tree, not the latter. PR c++/67829 gcc/cp/ChangeLog: * pt.c (unify) : 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. --- diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index b0155a9..d87382d 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 (DECL_TEMPLATE_TEMPLATE_PARM_P (arg)) + /* 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 0000000..6709406 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ttp34.C @@ -0,0 +1,14 @@ +// PR c++/67829 + +template class Purr; + +template class, class, class> +class Meow; + +template class P> +class Meow, int> { }; // 1 + +template class P, class T> +class Meow, T>; // 2 + +Meow, 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 0000000..e3303dc --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ttp34a.C @@ -0,0 +1,14 @@ +// PR c++/67829 + +template class Purr; + +template class, class> +class Meow; + +template class P> +class Meow > { }; // 1 + +template class P, class T> +class Meow >; // 2 + +Meow > kitty; diff --git a/gcc/testsuite/g++.dg/template/ttp34b.C b/gcc/testsuite/g++.dg/template/ttp34b.C new file mode 100644 index 0000000..ed3b3e8 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ttp34b.C @@ -0,0 +1,14 @@ +// PR c++/67829 + +template class Purr; + +template class> +class Meow; + +template class P> +class Meow, P> { }; // 1 + +template class P, class T> +class Meow, P>; // 2 + +Meow, Purr> kitty;