From 9db59310f2f62f18624d721fd88ec64fb6cce6c0 Mon Sep 17 00:00:00 2001 From: jakub Date: Fri, 6 May 2005 09:16:24 +0000 Subject: 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 --- gcc/varasm.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) (limited to 'gcc/varasm.c') 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)) { -- cgit v1.2.3