diff options
author | Jason Merrill <jason@gcc.gnu.org> | 2006-08-24 11:54:39 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2006-08-24 11:54:39 -0400 |
commit | c9cbfca6f52f65d6914a33715d39ec9fa0619a18 (patch) | |
tree | 6145e1985cc5cce5f430e5503ba9356571c67dc2 | |
parent | cd051390eb3cd88975f444d0174333bd3baf2085 (diff) | |
download | gcc-c9cbfca6f52f65d6914a33715d39ec9fa0619a18.zip gcc-c9cbfca6f52f65d6914a33715d39ec9fa0619a18.tar.gz gcc-c9cbfca6f52f65d6914a33715d39ec9fa0619a18.tar.bz2 |
re PR c++/27714 (operator new as friend in template class rejected)
PR c++/27714
* pt.c (push_template_decl_real): A friend template with class
scope isn't primary.
From-SVN: r116379
-rw-r--r-- | gcc/cp/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/cp/pt.c | 8 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/friend46.C | 9 |
3 files changed, 23 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index e2bc2db..e1ad1bf 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,4 +1,10 @@ -2006-08-11 Benjamin Smedberg <benjamin@smedbergs.us> +2006-08-23 Jason Merrill <jason@redhat.com> + + PR c++/27714 + * pt.c (push_template_decl_real): A friend template with class + scope isn't primary. + +2006-08-23 Benjamin Smedberg <benjamin@smedbergs.us> PR c++/28687 * rtti.c (build_dynamic_cast, build_dynamic_cast_1): diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 4a58ef3..5843a50 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -3022,7 +3022,13 @@ push_template_decl_real (tree decl, bool is_friend) DECL_CONTEXT (decl) = FROB_CONTEXT (current_namespace); /* See if this is a primary template. */ - primary = template_parm_scope_p (); + if (is_friend && ctx) + /* A friend template that specifies a class context, i.e. + template <typename T> friend void A<T>::f(); + is not primary. */ + primary = 0; + else + primary = template_parm_scope_p (); if (primary) { diff --git a/gcc/testsuite/g++.dg/template/friend46.C b/gcc/testsuite/g++.dg/template/friend46.C new file mode 100644 index 0000000..17dc0db --- /dev/null +++ b/gcc/testsuite/g++.dg/template/friend46.C @@ -0,0 +1,9 @@ +// PR c++/27714 + +template<typename> struct A +{ + static void* operator new(__SIZE_TYPE__); + template <typename T> friend void* A<T>::operator new(__SIZE_TYPE__); +}; + +A<int> a; |