From ca9e13823c9e8cf547dbcd98416e1b4dfcced5fa Mon Sep 17 00:00:00 2001 From: Kriang Lerdsuwanakij Date: Sun, 9 Mar 2003 14:30:18 +0000 Subject: [PATCH] re PR c++/9970 (previously declared inline friend can't access members) PR c++/9970 * decl.c (duplicate_decls): Only copy DECL_THUNKS for virtual functions. * g++.dg/lookup/friend1.C: New test. From-SVN: r64029 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/decl.c | 5 ++++- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/lookup/friend1.C | 15 +++++++++++++++ 4 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/lookup/friend1.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index d1538bc6dca..7d7debe3ed6 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2003-03-09 Kriang Lerdsuwanakij + + PR c++/9970 + * decl.c (duplicate_decls): Only copy DECL_THUNKS for virtual + functions. + 2003-03-08 Geoffrey Keating * lang-specs.h (c++-header): Change .pch to .gch. diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index fb3631329e2..639c5d04293 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -3554,7 +3554,10 @@ duplicate_decls (tree newdecl, tree olddecl) DECL_BEFRIENDING_CLASSES (newdecl) = chainon (DECL_BEFRIENDING_CLASSES (newdecl), DECL_BEFRIENDING_CLASSES (olddecl)); - DECL_THUNKS (newdecl) = DECL_THUNKS (olddecl); + /* DECL_THUNKS is only valid for virtual functions, + otherwise it is a DECL_FRIEND_CONTEXT. */ + if (DECL_VIRTUAL_P (newdecl)) + DECL_THUNKS (newdecl) = DECL_THUNKS (olddecl); } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8c11f8569cc..15d6935eba5 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2003-03-09 Kriang Lerdsuwanakij + + PR c++/9970 + * g++.dg/lookup/friend1.C: New test. + 2003-03-08 Mark Mitchell PR c++/9823 diff --git a/gcc/testsuite/g++.dg/lookup/friend1.C b/gcc/testsuite/g++.dg/lookup/friend1.C new file mode 100644 index 00000000000..47fe0556519 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/friend1.C @@ -0,0 +1,15 @@ +// { dg-do compile } + +// Origin: + +// PR c++/9970: In-class friend function definition after +// declaration lexical scope problem. + +void f(); +struct X +{ + enum { k = 1 }; + friend void f() { + char a[k]; + } +}; -- 2.30.2