aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2009-07-07 18:03:42 -0400
committerJason Merrill <jason@gcc.gnu.org>2009-07-07 18:03:42 -0400
commit438c0fa8a04a3f11df33890b3d183f64fa181b55 (patch)
tree4b3769f354167e67ba3fb45267ec9a8f63195607 /gcc
parent5e278028ed86b38bc0b649aa6e351d35c6ad539c (diff)
downloadgcc-438c0fa8a04a3f11df33890b3d183f64fa181b55.zip
gcc-438c0fa8a04a3f11df33890b3d183f64fa181b55.tar.gz
gcc-438c0fa8a04a3f11df33890b3d183f64fa181b55.tar.bz2
re PR c++/35828 ([C++0x] ICE on default template template parameter in template function)
PR c++/35828 * pt.c (tsubst_decl): Don't abort if we didn't change anything in a TEMPLATE_DECL's args. From-SVN: r149351
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/pt.c11
-rw-r--r--gcc/testsuite/ChangeLog3
-rw-r--r--gcc/testsuite/g++.dg/template/defarg12.C10
4 files changed, 24 insertions, 6 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index aa28747..051faf6 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2009-07-07 Jason Merrill <jason@redhat.com>
+
+ 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 <manu@gcc.gnu.org>
* semantics.c (finalize_nrv_r): Replace EXPR_LOCUS by
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 2fc2223..b4bd465 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 9e4ec3d..3f35f44 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,8 @@
2009-07-07 Jason Merrill <jason@redhat.com>
+ 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 0000000..d11848a
--- /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 ();
+}
+