From 55ece1b348b5c67402a6efa630dacfbba0bcf7cb Mon Sep 17 00:00:00 2001 From: Kriang Lerdsuwanakij Date: Mon, 14 Jul 2003 10:48:59 +0000 Subject: [PATCH] re PR c++/11154 (spurious ambiguity report for template class specialization) PR c++/11154 * pt.c (more_specialized_class): Add full_args parameter. (most_specialized_class): Adjust calls to more_specialized_class. * cp-tree.h (more_specialized_class): Adjust declaration. * g++.dg/template/partial2.C: New test. From-SVN: r69328 --- gcc/cp/ChangeLog | 7 +++++++ gcc/cp/cp-tree.h | 2 +- gcc/cp/pt.c | 15 +++++++++------ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/template/partial2.C | 14 ++++++++++++++ 5 files changed, 36 insertions(+), 7 deletions(-) create mode 100644 gcc/testsuite/g++.dg/template/partial2.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index ea04ac8ddb0..8cc02342dbe 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2003-07-14 Kriang Lerdsuwanakij + + PR c++/11154 + * pt.c (more_specialized_class): Add full_args parameter. + (most_specialized_class): Adjust calls to more_specialized_class. + * cp-tree.h (more_specialized_class): Adjust declaration. + 2003-07-14 Dan Nicolaescu * lex.c (enum tree_node_kind): Delete. diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 32b791fb805..8658be6d93a 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -3968,7 +3968,7 @@ extern tree instantiate_decl (tree, int); extern tree get_bindings (tree, tree, tree); extern int push_tinst_level (tree); extern void pop_tinst_level (void); -extern int more_specialized_class (tree, tree); +extern int more_specialized_class (tree, tree, tree); extern int is_member_template (tree); extern int comp_template_parms (tree, tree); extern int template_class_depth (tree); diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index ac032d13d95..ee9d2459d7e 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -9962,21 +9962,24 @@ more_specialized (tree pat1, tree pat2, int deduce, int len) 1 if PAT1 is more specialized than PAT2 as described in [temp.class.order]. -1 if PAT2 is more specialized than PAT1. - 0 if neither is more specialized. */ + 0 if neither is more specialized. + + FULL_ARGS is the full set of template arguments that triggers this + partial ordering. */ int -more_specialized_class (tree pat1, tree pat2) +more_specialized_class (tree pat1, tree pat2, tree full_args) { tree targs; int winner = 0; targs = get_class_bindings (TREE_VALUE (pat1), TREE_PURPOSE (pat1), - TREE_PURPOSE (pat2)); + add_outermost_template_args (full_args, TREE_PURPOSE (pat2))); if (targs) --winner; targs = get_class_bindings (TREE_VALUE (pat2), TREE_PURPOSE (pat2), - TREE_PURPOSE (pat1)); + add_outermost_template_args (full_args, TREE_PURPOSE (pat1))); if (targs) ++winner; @@ -10257,7 +10260,7 @@ most_specialized_class (tree tmpl, tree args) t = TREE_CHAIN (t); for (; t; t = TREE_CHAIN (t)) { - fate = more_specialized_class (champ, t); + fate = more_specialized_class (champ, t, args); if (fate == 1) ; else @@ -10274,7 +10277,7 @@ most_specialized_class (tree tmpl, tree args) for (t = list; t && t != champ; t = TREE_CHAIN (t)) { - fate = more_specialized_class (champ, t); + fate = more_specialized_class (champ, t, args); if (fate != 1) return error_mark_node; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e51dda89833..92c235c8d5f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2003-07-14 Kriang Lerdsuwanakij + + PR c++/11154 + * g++.dg/template/partial2.C: New test. + 2003-07-13 Mark Mitchell PR c++/11503 diff --git a/gcc/testsuite/g++.dg/template/partial2.C b/gcc/testsuite/g++.dg/template/partial2.C new file mode 100644 index 00000000000..ebfdce27889 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/partial2.C @@ -0,0 +1,14 @@ +// { dg-do compile } + +// Origin: lorgon1@yahoo.com + +// PR c++/11154: Multi-level template argument in partial ordering of +// class template + +template struct Outer { + template struct Foo {}; + template struct Foo {}; + template struct Foo {}; +}; + +Outer::Foo f; -- 2.30.2