summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2005-05-06 09:16:24 +0000
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2005-05-06 09:16:24 +0000
commit9db59310f2f62f18624d721fd88ec64fb6cce6c0 (patch)
tree591f1429a9825ae3b516a969900030bb459944ad
parent986af94042c982bd50a0a92920bdf33cf0a79d2c (diff)
downloadppe42-gcc-9db59310f2f62f18624d721fd88ec64fb6cce6c0.tar.gz
ppe42-gcc-9db59310f2f62f18624d721fd88ec64fb6cce6c0.zip
PR c++/20961
* varasm.c (merge_weak): Remove NEWDECL from WEAK_DECLS chain if both NEWDECL and OLDDECL are already weak. * g++.dg/ext/weak3.C: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@99306 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/ext/weak3.C17
-rw-r--r--gcc/varasm.c16
4 files changed, 43 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 1f163c3c9c5..4fed688a3fa 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2005-05-06 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/20961
+ * varasm.c (merge_weak): Remove NEWDECL from WEAK_DECLS chain
+ if both NEWDECL and OLDDECL are already weak.
+
2005-05-06 Richard Sandiford <rsandifo@redhat.com>
* config/rs6000/sysv4.h (EXTRA_SUBTARGET_SWITCHES): Delete.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index c981cee51d2..ae841559b0c 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2005-05-06 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/20961
+ * g++.dg/ext/weak3.C: New test.
+
2005-05-05 Mark Mitchell <mark@codesourcery.com>
PR c++/21352
diff --git a/gcc/testsuite/g++.dg/ext/weak3.C b/gcc/testsuite/g++.dg/ext/weak3.C
new file mode 100644
index 00000000000..360821acc48
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/weak3.C
@@ -0,0 +1,17 @@
+// PR c++/20961
+// Test for #pragma weak and __attribute__((weak)) being used together.
+// { dg-do compile }
+// { dg-require-weak "" }
+// { dg-options "" }
+
+// { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?_Z3foov" } }
+
+int foo ();
+#pragma weak foo
+
+int
+__attribute__((weak))
+foo ()
+{
+ return 0;
+}
diff --git a/gcc/varasm.c b/gcc/varasm.c
index f0799e1dfc1..6f6a817275d 100644
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -4303,7 +4303,21 @@ void
merge_weak (tree newdecl, tree olddecl)
{
if (DECL_WEAK (newdecl) == DECL_WEAK (olddecl))
- return;
+ {
+ if (DECL_WEAK (newdecl) && SUPPORTS_WEAK)
+ {
+ tree *pwd;
+ /* We put the NEWDECL on the weak_decls list at some point
+ and OLDDECL as well. Keep just OLDDECL on the list. */
+ for (pwd = &weak_decls; *pwd; pwd = &TREE_CHAIN (*pwd))
+ if (TREE_VALUE (*pwd) == newdecl)
+ {
+ *pwd = TREE_CHAIN (*pwd);
+ break;
+ }
+ }
+ return;
+ }
if (DECL_WEAK (newdecl))
{
OpenPOWER on IntegriCloud