aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>2002-06-20 14:38:06 +0000
committerKriang Lerdsuwanakij <lerdsuwa@gcc.gnu.org>2002-06-20 14:38:06 +0000
commit342cea9509fcfea8b53cfbb4c67ee6a74aff11cf (patch)
treed6b6776755002c9694317b9f538c87a867849cb0
parent5bc93be506e50bb4fdb79692cd9063c880c96601 (diff)
downloadgcc-342cea9509fcfea8b53cfbb4c67ee6a74aff11cf.zip
gcc-342cea9509fcfea8b53cfbb4c67ee6a74aff11cf.tar.gz
gcc-342cea9509fcfea8b53cfbb4c67ee6a74aff11cf.tar.bz2
re PR c++/6723 (ICE on source code successfully compiled by previous versions)
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
-rw-r--r--gcc/cp/ChangeLog7
-rw-r--r--gcc/cp/pt.c12
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/g++.dg/template/ttp4.C11
4 files changed, 31 insertions, 3 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index b599aba..b570cc3 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 873e5a3..c100122 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -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,
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 0c1b43c..e2e8799 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..4dff701
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/ttp4.C
@@ -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 { };