diff options
| author | lerdsuwa <lerdsuwa@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-07-16 15:42:15 +0000 |
|---|---|---|
| committer | lerdsuwa <lerdsuwa@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-07-16 15:42:15 +0000 |
| commit | 6994351f026f1068c7c2e91d4e06d97323c685f2 (patch) | |
| tree | ce989dcd709f54247a75f3bf17e5c9c1ca60836c | |
| parent | 3fad71f2e3aaad96a3c32ec7120015207bed5704 (diff) | |
| download | ppe42-gcc-6994351f026f1068c7c2e91d4e06d97323c685f2.tar.gz ppe42-gcc-6994351f026f1068c7c2e91d4e06d97323c685f2.zip | |
PR c++/5421
* decl.c (grokdeclarator): Handle TEMPLATE_ID_EXPR if friend
is a member of other class.
* friend.c (do_friend): Don't build TEMPLATE_DECL if friend
is a specialization of function template.
* g++.dg/template/friend21.C: New test.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@69457 138bc75d-0d04-0410-961f-82ee72b054a4
| -rw-r--r-- | gcc/cp/ChangeLog | 8 | ||||
| -rw-r--r-- | gcc/cp/decl.c | 5 | ||||
| -rw-r--r-- | gcc/cp/friend.c | 2 | ||||
| -rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
| -rw-r--r-- | gcc/testsuite/g++.dg/template/friend21.C | 16 |
5 files changed, 35 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 4c750887af2..68bcb3af7b3 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,11 @@ +2003-07-16 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> + + PR c++/5421 + * decl.c (grokdeclarator): Handle TEMPLATE_ID_EXPR if friend + is a member of other class. + * friend.c (do_friend): Don't build TEMPLATE_DECL if friend + is a specialization of function template. + 2003-07-16 Gabriel Dos Reis <gdr@integrable-solutions.net> PR c++/10903 diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 9147caffa66..1dd2ddf7a94 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -11488,7 +11488,10 @@ grokdeclarator (tree declarator, members of other classes. */ /* All method decls are public, so tell grokfndecl to set TREE_PUBLIC, also. */ - decl = grokfndecl (ctype, type, declarator, declarator, + decl = grokfndecl (ctype, type, + TREE_CODE (declarator) != TEMPLATE_ID_EXPR + ? declarator : dname, + declarator, virtualp, flags, quals, raises, friendp ? -1 : 0, friendp, 1, 0, funcdef_flag, template_count, in_namespace); diff --git a/gcc/cp/friend.c b/gcc/cp/friend.c index 220b01214bb..e31a0559a0f 100644 --- a/gcc/cp/friend.c +++ b/gcc/cp/friend.c @@ -357,6 +357,8 @@ do_friend (tree ctype, tree declarator, tree decl, tree parmdecls, if (is_friend_template) decl = DECL_TI_TEMPLATE (push_template_decl (decl)); + else if (DECL_TEMPLATE_INFO (decl)) + ; else if (template_class_depth (current_class_type)) decl = push_template_decl_real (decl, /*is_friend=*/1); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ab2deeb4fe6..68f98a1366c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2003-07-16 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> + + PR c++/5421 + * g++.dg/template/friend21.C: New test. + 2003-07-16 Jakub Jelinek <jakub@redhat.com> * gcc.dg/cleanup-8.c: New test. diff --git a/gcc/testsuite/g++.dg/template/friend21.C b/gcc/testsuite/g++.dg/template/friend21.C new file mode 100644 index 00000000000..854ed67d592 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/friend21.C @@ -0,0 +1,16 @@ +// { dg-do compile } + +// Origin: ajl13@bellatlantic.net + +// PR c++/5421: ICE for specialization of member function template +// as friend. + +struct B { + template <class T> void b(); +}; + +template <class T> class A { + friend void B::b<T>(); +}; + +static A<int> a; |

