diff options
author | Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> | 2003-06-03 13:01:44 +0000 |
---|---|---|
committer | Kriang Lerdsuwanakij <lerdsuwa@gcc.gnu.org> | 2003-06-03 13:01:44 +0000 |
commit | 6c07f44866d52ab85205439ee2319f24c8a596f5 (patch) | |
tree | 4cfb395504d265335588864454a355706eeed5d3 | |
parent | 075ec276a051c77c1542992980d651f832e7140a (diff) | |
download | gcc-6c07f44866d52ab85205439ee2319f24c8a596f5.zip gcc-6c07f44866d52ab85205439ee2319f24c8a596f5.tar.gz gcc-6c07f44866d52ab85205439ee2319f24c8a596f5.tar.bz2 |
re PR c++/10940 (Bad code with explicit specialization)
PR c++/10940
* pt.c (check_explicit_specialization): Check for 'static'
earlier.
* g++.dg/template/spec10.C: New test.
From-SVN: r67373
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/pt.c | 22 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/spec10.C | 27 |
4 files changed, 50 insertions, 10 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 85c5062..158db73 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2003-06-03 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> + + PR c++/10940 + * pt.c (check_explicit_specialization): Check for 'static' + earlier. + 2003-05-31 Diego Novillo <dnovillo@redhat.com> * class.c (dump_array): Call CONSTRUCTOR_ELTS to access diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 2e163c8..52bbc51 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -1849,6 +1849,18 @@ check_explicit_specialization (declarator, decl, template_count, flags) return instantiate_template (tmpl, targs, tf_error); } + /* If we thought that the DECL was a member function, but it + turns out to be specializing a static member function, + make DECL a static member function as well. We also have + to adjust last_function_parms to avoid confusing + start_function later. */ + if (DECL_STATIC_FUNCTION_P (tmpl) + && DECL_NONSTATIC_MEMBER_FUNCTION_P (decl)) + { + revert_static_member_fn (decl); + last_function_parms = TREE_CHAIN (last_function_parms); + } + /* If this is a specialization of a member template of a template class. In we want to return the TEMPLATE_DECL, not the specialization of it. */ @@ -1865,16 +1877,6 @@ check_explicit_specialization (declarator, decl, template_count, flags) return tmpl; } - /* If we thought that the DECL was a member function, but it - turns out to be specializing a static member function, - make DECL a static member function as well. */ - if (DECL_STATIC_FUNCTION_P (tmpl) - && DECL_NONSTATIC_MEMBER_FUNCTION_P (decl)) - { - revert_static_member_fn (decl); - last_function_parms = TREE_CHAIN (last_function_parms); - } - /* Set up the DECL_TEMPLATE_INFO for DECL. */ DECL_TEMPLATE_INFO (decl) = tree_cons (tmpl, targs, NULL_TREE); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a7da74f..a5602f2 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2003-06-03 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> + + PR c++/10940 + * g++.dg/template/spec10.C: New test. + 2003-06-03 Roger Sayle <roger@eyesopen.com> * gcc.dg/builtins-16.c: New test case. diff --git a/gcc/testsuite/g++.dg/template/spec10.C b/gcc/testsuite/g++.dg/template/spec10.C new file mode 100644 index 0000000..f790155 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/spec10.C @@ -0,0 +1,27 @@ +// { dg-do run } + +// Origin: Lynn Akers <lakers@peachtree.com> + +// PR c++/10940: Problem handling parameter list for static member +// that is a specialization of a member template of a template class. + +template<int b> +class o +{ +public: + template<typename T> static void do_add(T* p, T v); +}; + +template<> +template<typename T> +inline void o<32>::do_add(T* p, T v) +{ + *p += v; +} + +int main() +{ + int a = 0x1000; + o<32>().do_add<int>(&a, 0x2000); + return a; +} |