pt.c (lookup_template_class): Build complete template arguments for BOUND_TEMPLATE_TE...
authorKriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
Sat, 13 Oct 2001 15:00:44 +0000 (15:00 +0000)
committerKriang Lerdsuwanakij <lerdsuwa@gcc.gnu.org>
Sat, 13 Oct 2001 15:00:44 +0000 (15:00 +0000)
* pt.c (lookup_template_class): Build complete template arguments
for BOUND_TEMPLATE_TEMPLATE_PARM.

From-SVN: r46245

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

index 2b1b453526cb0cceb724c7d7844bfc386f480d93..92907b8d63872e1754978bc4b14f03c6503a92e4 100644 (file)
@@ -1,3 +1,8 @@
+2001-10-13  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
+
+       * pt.c (lookup_template_class): Build complete template arguments
+       for BOUND_TEMPLATE_TEMPLATE_PARM.
+
 2001-10-12  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
 
        * cp-tree.h (TYPE_BINFO): Update comment.
index cd68629ab9284060124d8d57d991883489ae88ba..e2904b5cf5f23aabad88b60681442e2360b1a2ec 100644 (file)
@@ -3913,6 +3913,19 @@ lookup_template_class (d1, arglist, in_decl, context, entering_scope, complain)
 
       parmlist = DECL_INNERMOST_TEMPLATE_PARMS (template);
 
+      /* Consider an example where a template template parameter declared as
+
+          template <class T, class U = std::allocator<T> > class TT
+
+        The template parameter level of T and U are one level larger than 
+        of TT.  To proper process the default argument of U, say when an 
+        instantiation `TT<int>' is seen, we need to build the full
+        arguments containing {int} as the innermost level.  Outer levels
+        can be obtained from `current_template_args ()'.  */
+
+      if (processing_template_decl)
+       arglist = add_to_template_args (current_template_args (), arglist);
+
       arglist2 = coerce_template_parms (parmlist, arglist, template,
                                         complain, /*require_all_args=*/1);
       if (arglist2 == error_mark_node)
diff --git a/gcc/testsuite/g++.dg/template/ttp2.C b/gcc/testsuite/g++.dg/template/ttp2.C
new file mode 100644 (file)
index 0000000..45d9abd
--- /dev/null
@@ -0,0 +1,17 @@
+// Copyright (C) 2001 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+// { dg-do compile }
+
+template <class U> struct Alloc {};
+
+template <class T, class U = Alloc<T> > struct Vector {};
+
+template <template <class T, class U = Alloc<T> > class TT>
+struct C {
+       TT<int> tt;
+};
+
+int main()
+{
+       C<Vector> c;
+}