OSDN Git Service

PR c++/6723
authorlerdsuwa <lerdsuwa@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 20 Jun 2002 14:38:06 +0000 (14:38 +0000)
committerlerdsuwa <lerdsuwa@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 20 Jun 2002 14:38:06 +0000 (14:38 +0000)
* pt.c (lookup_template_class): Don't build complete argument of
BOUND_TEMPLATE_TEMPLATE_PARM if appeared as a default template
argument.

* g++.dg/template/ttp4.C: New test.

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

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

index b599aba..b570cc3 100644 (file)
@@ -1,3 +1,10 @@
+2002-06-20  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
+
+       PR c++/6723
+       * pt.c (lookup_template_class): Don't build complete argument of
+       BOUND_TEMPLATE_TEMPLATE_PARM if appeared as a default template
+       argument.
+
 2002-06-19  Akim Demaille  <akim@epita.fr>
 
        * parse.y (TYPENAME): Rename as tTYPENAME to avoid the clash with
index 873e5a3..c100122 100644 (file)
@@ -3967,10 +3967,16 @@ lookup_template_class (d1, arglist, in_decl, context, entering_scope, complain)
         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 ()'.  */
+        arguments containing {int} as the innermost level.  Outer levels,
+        available when not appearing as default template argument, can be
+        obtained from `current_template_args ()'.
 
-      if (processing_template_decl)
+        Suppose that TT is later substituted with std::vector.  The above
+        instantiation is `TT<int, std::allocator<T> >' with TT at
+        level 1, and T at level 2, while the template arguments at level 1
+        becomes {std::vector} and the inner level 2 is {int}.  */
+
+      if (current_template_parms)
        arglist = add_to_template_args (current_template_args (), arglist);
 
       arglist2 = coerce_template_parms (parmlist, arglist, template,
index 0c1b43c..e2e8799 100644 (file)
@@ -1,3 +1,7 @@
+2002-06-20  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
+
+       * g++.dg/template/ttp4.C: New test.
+
 2002-06-19  Jakub Jelinek  <jakub@redhat.com>
 
        * g++.dg/opt/vt1.C: Fix regexp.
diff --git a/gcc/testsuite/g++.dg/template/ttp4.C b/gcc/testsuite/g++.dg/template/ttp4.C
new file mode 100644 (file)
index 0000000..4dff701
--- /dev/null
@@ -0,0 +1,11 @@
+// { dg-do compile }
+// Origin: Ewgenij Gawrilow <gawrilow@math.tu-berlin.de>
+
+// PR c++/6723
+// ICE when default template argument contains instantiation of
+// template template parameter.
+
+template <typename A, typename B,
+         template <typename,typename> class Predicate,
+         bool _matches=Predicate<A,B>::answer>
+struct helper { };