diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 2b1b453526cb0cceb724c7d7844bfc386f480d93..92907b8d63872e1754978bc4b14f03c6503a92e4 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -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. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index cd68629ab9284060124d8d57d991883489ae88ba..e2904b5cf5f23aabad88b60681442e2360b1a2ec 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -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 index 0000000000000000000000000000000000000000..45d9abddfe286efa224f1256f37d7bf2353eb9b5 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ttp2.C @@ -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; +}