diff options
author | Dodji Seketeli <dodji@redhat.com> | 2010-04-07 15:16:12 +0000 |
---|---|---|
committer | Dodji Seketeli <dodji@gcc.gnu.org> | 2010-04-07 17:16:12 +0200 |
commit | 5fd5c97a3458128c95577bbff190795f39e4cdfb (patch) | |
tree | 5855473c06cc1ce2175bfc2d88f39aee807e5c62 /gcc | |
parent | 7c094c11510e9a7bb99a9b2b2dd4f6087cedda3c (diff) | |
download | gcc-5fd5c97a3458128c95577bbff190795f39e4cdfb.zip gcc-5fd5c97a3458128c95577bbff190795f39e4cdfb.tar.gz gcc-5fd5c97a3458128c95577bbff190795f39e4cdfb.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/pt.c | 3 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/crash94.C | 28 |
4 files changed, 41 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 6af8a20..3d41244 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,11 @@ 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 * typeck2.c (process_init_constructor_record): value-initialize members that are are not explicitely diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 0bd55e1..13bb5aa 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 65c9f02..0032dd8 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 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 * g++.dg/init/aggr5.C: New test. * g++.dg/init/aggr5.C: New test. diff --git a/gcc/testsuite/g++.dg/template/crash94.C b/gcc/testsuite/g++.dg/template/crash94.C new file mode 100644 index 0000000..810aed0 --- /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>; |