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
This commit is contained in:
parent
9a8c9b44cc
commit
55ece1b348
@ -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.
|
||||
|
@ -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);
|
||||
|
15
gcc/cp/pt.c
15
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;
|
||||
}
|
||||
|
@ -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
|
||||
|
14
gcc/testsuite/g++.dg/template/partial2.C
Normal file
14
gcc/testsuite/g++.dg/template/partial2.C
Normal file
@ -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;
|
Loading…
Reference in New Issue
Block a user