From 5fd5c97a3458128c95577bbff190795f39e4cdfb Mon Sep 17 00:00:00 2001
From: Dodji Seketeli <dodji@redhat.com>
Date: Wed, 7 Apr 2010 15:16:12 +0000
Subject: [PATCH] re PR c++/42697 (ice-on-legal-code: template class template
 function local objects)

Fix PR c++/42697

gcc/cp/ChangeLog:
	PR c++/42697
	*pt.c (tsubst_decl): Get the arguments of a specialization from
	the specialization template, not from the most general template.

gcc/testsuite/ChangeLog:
	PR c++/42697
	* g++.dg/template/crash94.C: New test.

From-SVN: r158068
---
 gcc/cp/ChangeLog                        |  6 ++++++
 gcc/cp/pt.c                             |  3 ++-
 gcc/testsuite/ChangeLog                 |  5 +++++
 gcc/testsuite/g++.dg/template/crash94.C | 28 +++++++++++++++++++++++++
 4 files changed, 41 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/g++.dg/template/crash94.C

diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 6af8a20af12e..3d412443a7be 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2010-04-07  Dodji Seketeli  <dodji@redhat.com>
+
+	PR c++/42697
+	*pt.c (tsubst_decl): Get the arguments of a specialization from
+	the specialization template, not from the most general template.
+
 2010-04-07  Dodji Seketeli  <dodji@redhat.com>
 
 	PR c++/40239
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 0bd55e1190c3..13bb5aadf4d1 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -9020,7 +9020,8 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain)
 	       specialize R.  */
 	    gen_tmpl = most_general_template (DECL_TI_TEMPLATE (t));
 	    argvec = tsubst_template_args (DECL_TI_ARGS
-					   (DECL_TEMPLATE_RESULT (gen_tmpl)),
+                                          (DECL_TEMPLATE_RESULT
+                                                 (DECL_TI_TEMPLATE (t))),
 					   args, complain, in_decl);
 
 	    /* Check to see if we already have this specialization.  */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 65c9f0235e89..0032dd813b0d 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2010-04-07  Dodji Seketeli  <dodji@redhat.com>
+
+	PR c++/42697
+	* g++.dg/template/crash94.C: New test.
+
 2010-04-07  Dodji Seketeli  <dodji@redhat.com>
 
 	PR c++/40239
diff --git a/gcc/testsuite/g++.dg/template/crash94.C b/gcc/testsuite/g++.dg/template/crash94.C
new file mode 100644
index 000000000000..810aed0a61c6
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/crash94.C
@@ -0,0 +1,28 @@
+// Origin: PR c++/42697
+// { dg-do compile }
+
+template<class Value_t>
+class fparser
+{
+    template<bool Option>
+    void eval2(Value_t r[2]);
+public:
+    void evaltest();
+};
+
+template<>
+template<bool Option>
+void fparser<int>::eval2(int r[2])
+{
+    struct ObjType {};
+}
+
+
+template<class Value_t>
+void fparser<Value_t>::evaltest
+    ()
+{
+    eval2<false>(0);
+}
+
+template class fparser<int>;
-- 
GitLab