diff options
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/decl.c | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/lookup/friend1.C | 15 |
4 files changed, 30 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index d1538bc..7d7debe 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2003-03-09 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> + + PR c++/9970 + * decl.c (duplicate_decls): Only copy DECL_THUNKS for virtual + functions. + 2003-03-08 Geoffrey Keating <geoffk@apple.com> * lang-specs.h (c++-header): Change .pch to .gch. diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index fb36313..639c5d0 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 8c11f85..15d6935 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2003-03-09 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> + + PR c++/9970 + * g++.dg/lookup/friend1.C: New test. + 2003-03-08 Mark Mitchell <mark@codesourcery.com> 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 0000000..47fe055 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/friend1.C @@ -0,0 +1,15 @@ +// { dg-do compile } + +// Origin: <matz@suse.de> + +// 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]; + } +}; |