diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index aa28747c8569..051faf6e6225 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2009-07-07 Jason Merrill + + PR c++/35828 + * pt.c (tsubst_decl): Don't abort if we didn't change anything + in a TEMPLATE_DECL's args. + 2009-07-07 Manuel López-Ibáñez * semantics.c (finalize_nrv_r): Replace EXPR_LOCUS by diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 2fc2223703c0..b4bd465860e2 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -8306,8 +8306,7 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain) case TEMPLATE_DECL: { /* We can get here when processing a member function template, - member class template, and template template parameter of - a template class. */ + member class template, or template template parameter. */ tree decl = DECL_TEMPLATE_RESULT (t); tree spec; tree tmpl_args; @@ -8351,10 +8350,10 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain) if (full_args == error_mark_node) return error_mark_node; - /* tsubst_template_args doesn't copy the vector if - nothing changed. But, *something* should have - changed. */ - gcc_assert (full_args != tmpl_args); + /* If this is a default template template argument, + tsubst might not have changed anything. */ + if (full_args == tmpl_args) + return t; hash = hash_tmpl_and_args (t, full_args); spec = retrieve_specialization (t, full_args, hash); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9e4ec3defb15..3f35f440fd93 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2009-07-07 Jason Merrill + PR c++/35828 + * g++.dg/template/defarg12.C: New. + PR c++/37816 * g++.dg/cpp0x/enum7.C: New. diff --git a/gcc/testsuite/g++.dg/template/defarg12.C b/gcc/testsuite/g++.dg/template/defarg12.C new file mode 100644 index 000000000000..d11848af2286 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/defarg12.C @@ -0,0 +1,10 @@ +// PR c++/35828 +// { dg-options "-std=c++0x" } + +template < typename > struct A ; +template < template < typename > class = A > +void test () +{ + test (); +} +