diff options
| -rw-r--r-- | gcc/cp/ChangeLog | 7 | ||||
| -rw-r--r-- | gcc/cp/cp-tree.h | 2 | ||||
| -rw-r--r-- | gcc/cp/pt.c | 15 | ||||
| -rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
| -rw-r--r-- | gcc/testsuite/g++.dg/template/partial2.C | 14 |
5 files changed, 36 insertions, 7 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index ea04ac8..8cc0234 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2003-07-14 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> + + 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 <dann@ics.uci.edu> * lex.c (enum tree_node_kind): Delete. diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 32b791f..8658be6 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 ac032d1..ee9d245 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 e51dda8..92c235c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2003-07-14 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> + + PR c++/11154 + * g++.dg/template/partial2.C: New test. + 2003-07-13 Mark Mitchell <mark@codesourcery.com> 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 0000000..ebfdce2 --- /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 <class A> struct Outer { + template <class T, class U = void, class V = void> struct Foo {}; + template <class T, class U> struct Foo<T,U,void> {}; + template <class T> struct Foo<T,void,void> {}; +}; + +Outer<int>::Foo<int,void,void> f; |
