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: r155975
This commit is contained in:
Dodji Seketeli 2010-01-17 10:24:16 +00:00 committed by Dodji Seketeli
parent a90110c3df
commit 4548cb4b83
4 changed files with 41 additions and 1 deletions

View File

@ -1,3 +1,9 @@
2010-01-17 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-01-16 Jason Merrill <jason@redhat.com>
PR c++/42761

View File

@ -8825,7 +8825,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. */

View File

@ -1,3 +1,8 @@
2010-01-17 Dodji Seketeli <dodji@redhat.com>
PR c++/42697
* g++.dg/template/crash94.C: New test.
2010-01-17 Jie Zhang <jie.zhang@analog.com>
PR debug/42767

View File

@ -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>;