From 342cea9509fcfea8b53cfbb4c67ee6a74aff11cf Mon Sep 17 00:00:00 2001 From: Kriang Lerdsuwanakij Date: Thu, 20 Jun 2002 14:38:06 +0000 Subject: 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 --- gcc/cp/ChangeLog | 7 +++++++ gcc/cp/pt.c | 12 +++++++++--- gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/g++.dg/template/ttp4.C | 11 +++++++++++ 4 files changed, 31 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/g++.dg/template/ttp4.C (limited to 'gcc') 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 + + 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 * 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' 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 >' 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 + + * g++.dg/template/ttp4.C: New test. + 2002-06-19 Jakub Jelinek * 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 + +// PR c++/6723 +// ICE when default template argument contains instantiation of +// template template parameter. + +template class Predicate, + bool _matches=Predicate::answer> +struct helper { }; -- cgit v1.1