[C++ PATCH] Fix default arg processing of template template parm
Kriang Lerdsuwanakij
lerdsuwa@users.sourceforge.net
Fri Oct 12 07:53:00 GMT 2001
Hi
The current GCC doesn't support the default argument processing behavior
of template template parameters. This is important when the template
template parameter is intended for standard containers such as
std::vector. To declare a class template taking std::vector as its
argument, we have to use the syntax
template<template<class T, class U = std::allocator<T> > class TT>
struct C {
TT<int> t; // Require default argument of U
};
C<std::vector> c;
The default argument of U that depends on other parameters (T in this case)
is not correctly expanded. The appended patch fixes this problem.
Bootstrapped and tested on i686-linux-gnu with no regressions.
Ok to install in the main trunk?
--Kriang
2001-10-12 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
* pt.c (lookup_template_class): Build complete template arguments
for BOUND_TEMPLATE_TEMPLATE_PARM.
diff -cprN gcc-main-save3/gcc/cp/pt.c gcc-main-new/gcc/cp/pt.c
*** gcc-main-save3/gcc/cp/pt.c Sat Sep 22 22:46:23 2001
--- gcc-main-new/gcc/cp/pt.c Fri Oct 12 20:28:42 2001
*************** lookup_template_class (d1, arglist, in_d
*** 3918,3923 ****
--- 3918,3936 ----
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 -cprN gcc-main-save3/gcc/testsuite/g++.dg/template/ttp2.C gcc-main-new/gcc/testsuite/g++.dg/template/ttp2.C
*** gcc-main-save3/gcc/testsuite/g++.dg/template/ttp2.C Thu Jan 1 07:00:00 1970
--- gcc-main-new/gcc/testsuite/g++.dg/template/ttp2.C Thu Oct 11 22:26:42 2001
***************
*** 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;
+ }
More information about the Gcc-patches
mailing list