]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/6723 (ICE on source code successfully compiled by previous versions)
authorKriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
Thu, 20 Jun 2002 14:38:06 +0000 (14:38 +0000)
committerKriang Lerdsuwanakij <lerdsuwa@gcc.gnu.org>
Thu, 20 Jun 2002 14:38:06 +0000 (14:38 +0000)
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.

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

From-SVN: r54831

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

index b599aba347f49dd528889b808b4060ba2ba77718..b570cc32ee701cd74e35737c83b69e9a6eeec257 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 873e5a3f1416deb6d0670c63fdd0cafe797e05d0..c10012247dc762aec0f66038099a003d26e99831 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 0c1b43ce5330fd64b5f7ddd9283051d99014d2b7..e2e879984c7ae3d52ed8a3689fe94400ddc9ab72 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 { };