Commit 55ece1b3 by Kriang Lerdsuwanakij Committed by Kriang Lerdsuwanakij

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
parent 9a8c9b44
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> 2003-07-14 Dan Nicolaescu <dann@ics.uci.edu>
* lex.c (enum tree_node_kind): Delete. * lex.c (enum tree_node_kind): Delete.
......
...@@ -3968,7 +3968,7 @@ extern tree instantiate_decl (tree, int); ...@@ -3968,7 +3968,7 @@ extern tree instantiate_decl (tree, int);
extern tree get_bindings (tree, tree, tree); extern tree get_bindings (tree, tree, tree);
extern int push_tinst_level (tree); extern int push_tinst_level (tree);
extern void pop_tinst_level (void); 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 is_member_template (tree);
extern int comp_template_parms (tree, tree); extern int comp_template_parms (tree, tree);
extern int template_class_depth (tree); extern int template_class_depth (tree);
......
...@@ -9962,21 +9962,24 @@ more_specialized (tree pat1, tree pat2, int deduce, int len) ...@@ -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 PAT1 is more specialized than PAT2 as described in [temp.class.order].
-1 if PAT2 is more specialized than PAT1. -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 int
more_specialized_class (tree pat1, tree pat2) more_specialized_class (tree pat1, tree pat2, tree full_args)
{ {
tree targs; tree targs;
int winner = 0; int winner = 0;
targs = get_class_bindings (TREE_VALUE (pat1), TREE_PURPOSE (pat1), targs = get_class_bindings (TREE_VALUE (pat1), TREE_PURPOSE (pat1),
TREE_PURPOSE (pat2)); add_outermost_template_args (full_args, TREE_PURPOSE (pat2)));
if (targs) if (targs)
--winner; --winner;
targs = get_class_bindings (TREE_VALUE (pat2), TREE_PURPOSE (pat2), targs = get_class_bindings (TREE_VALUE (pat2), TREE_PURPOSE (pat2),
TREE_PURPOSE (pat1)); add_outermost_template_args (full_args, TREE_PURPOSE (pat1)));
if (targs) if (targs)
++winner; ++winner;
...@@ -10257,7 +10260,7 @@ most_specialized_class (tree tmpl, tree args) ...@@ -10257,7 +10260,7 @@ most_specialized_class (tree tmpl, tree args)
t = TREE_CHAIN (t); t = TREE_CHAIN (t);
for (; t; 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) if (fate == 1)
; ;
else else
...@@ -10274,7 +10277,7 @@ most_specialized_class (tree tmpl, tree args) ...@@ -10274,7 +10277,7 @@ most_specialized_class (tree tmpl, tree args)
for (t = list; t && t != champ; t = TREE_CHAIN (t)) 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) if (fate != 1)
return error_mark_node; return error_mark_node;
} }
......
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> 2003-07-13 Mark Mitchell <mark@codesourcery.com>
PR c++/11503 PR c++/11503
......
// { 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;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment