OSDN Git Service

PR c++/11154
authorlerdsuwa <lerdsuwa@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 14 Jul 2003 10:48:59 +0000 (10:48 +0000)
committerlerdsuwa <lerdsuwa@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 14 Jul 2003 10:48:59 +0000 (10:48 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@69328 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/cp-tree.h
gcc/cp/pt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/template/partial2.C [new file with mode: 0644]

index ea04ac8..8cc0234 100644 (file)
@@ -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.
index 32b791f..8658be6 100644 (file)
@@ -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);
index ac032d1..ee9d245 100644 (file)
@@ -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;
     }
index e51dda8..92c235c 100644 (file)
@@ -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 (file)
index 0000000..ebfdce2
--- /dev/null
@@ -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;