From b429fdf002777908ae76c5de195e5403fa6cb398 Mon Sep 17 00:00:00 2001 From: Kriang Lerdsuwanakij Date: Sat, 16 Dec 2000 07:57:21 +0000 Subject: [PATCH] pt.c (unify): Handle when both ARG and PARM are BOUND_TEMPLATE_TEMPLATE_PARM. * pt.c (unify): Handle when both ARG and PARM are BOUND_TEMPLATE_TEMPLATE_PARM. * g++.old-deja/g++.pt/ttp65.C: New test. From-SVN: r38301 --- gcc/cp/ChangeLog | 5 +++ gcc/cp/pt.c | 12 ++++--- gcc/testsuite/ChangeLog | 4 +++ gcc/testsuite/g++.old-deja/g++.pt/ttp65.C | 38 +++++++++++++++++++++++ 4 files changed, 54 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/g++.old-deja/g++.pt/ttp65.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 7437490bc31..f94fdc1ad9d 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2000-12-15 Kriang Lerdsuwanakij + + * pt.c (unify): Handle when both ARG and PARM are + BOUND_TEMPLATE_TEMPLATE_PARM. + 2000-12-15 Kriang Lerdsuwanakij * pt.c (reduce_template_parm_level): Set DECL_ARTIFICIAL and diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index ac6fc165d51..3a0096e503c 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -8417,16 +8417,18 @@ unify (tparms, targs, parm, arg, strict) if (TREE_CODE (parm) == BOUND_TEMPLATE_TEMPLATE_PARM) { - /* ARG must be constructed from a template class. */ - if (TREE_CODE (arg) != RECORD_TYPE || !CLASSTYPE_TEMPLATE_INFO (arg)) + /* ARG must be constructed from a template class or a template + template parameter. */ + if (TREE_CODE (arg) != BOUND_TEMPLATE_TEMPLATE_PARM + && (TREE_CODE (arg) != RECORD_TYPE || !CLASSTYPE_TEMPLATE_INFO (arg))) return 1; { tree parmtmpl = TYPE_TI_TEMPLATE (parm); tree parmvec = TYPE_TI_ARGS (parm); - tree argvec = CLASSTYPE_TI_ARGS (arg); + tree argvec = TYPE_TI_ARGS (arg); tree argtmplvec - = DECL_INNERMOST_TEMPLATE_PARMS (CLASSTYPE_TI_TEMPLATE (arg)); + = DECL_INNERMOST_TEMPLATE_PARMS (TYPE_TI_TEMPLATE (arg)); int i; /* The parameter and argument roles have to be switched here @@ -8455,7 +8457,7 @@ unify (tparms, targs, parm, arg, strict) return 1; } } - arg = CLASSTYPE_TI_TEMPLATE (arg); + arg = TYPE_TI_TEMPLATE (arg); /* Fall through to deduce template name. */ } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b43a4628473..3b8b153c2b9 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2000-12-15 Kriang Lerdsuwanakij + + * g++.old-deja/g++.pt/ttp65.C: New test. + 2000-12-15 Kriang Lerdsuwanakij * g++.old-deja/g++.pt/ttp64.C: New test. diff --git a/gcc/testsuite/g++.old-deja/g++.pt/ttp65.C b/gcc/testsuite/g++.old-deja/g++.pt/ttp65.C new file mode 100644 index 00000000000..9f4507ac688 --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.pt/ttp65.C @@ -0,0 +1,38 @@ +// Build don't link: + +// Copyright (C) 2000 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij + +// Bug: We used reject template unification of two bound template template +// parameters. + +template class C +{ +}; + +template void f(C c) +{ +} + +template void f(C c) +{ +} + +template class C, class T, class U> +void g(C c) +{ +} + +template class C, class T> void g(C c) +{ +} + +int main() +{ + C c1; + f(c1); + g(c1); + C c2; + f(c2); + g(c2); +} -- 2.30.2