aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/decl.c5
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/lookup/friend1.C15
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];
+ }
+};