diff options
author | Jan Hubicka <jh@suse.cz> | 2011-01-25 00:07:25 +0100 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2011-01-24 23:07:25 +0000 |
commit | e8ba94fc1fe2d7d96bfc2fa5293c1bb0b86a5b52 (patch) | |
tree | 22cf10e472b5ae4e466e1ea53c1f2933f186775d /gcc | |
parent | 71c67403a2faf26b64c2bf525e392953a2707aa3 (diff) | |
download | gcc-e8ba94fc1fe2d7d96bfc2fa5293c1bb0b86a5b52.zip gcc-e8ba94fc1fe2d7d96bfc2fa5293c1bb0b86a5b52.tar.gz gcc-e8ba94fc1fe2d7d96bfc2fa5293c1bb0b86a5b52.tar.bz2 |
re PR c/21659 ([unit-at-a-time] "weak declaration must precede definition" error missing at >= O1)
PR c/21659
* doc/extend.texi (weak pragma): Drop claim that it must
appear before definition.
* varasm.c (merge_weak, declare_weak): Only sanity check
that DECL is not output at a time it is declared weak.
From-SVN: r169184
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/doc/extend.texi | 3 | ||||
-rw-r--r-- | gcc/varasm.c | 21 |
3 files changed, 17 insertions, 15 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9a57795..c61e513 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2011-01-24 Jan Hubicka <jh@suse.cz> + + PR c/21659 + * doc/extend.texi (weak pragma): Drop claim that it must + appear before definition. + * varasm.c (merge_weak, declare_weak): Only sanity check + that DECL is not output at a time it is declared weak. + 2011-01-24 Kenneth Zadeck <zadeck@naturalbridge.com> * machmode.def: Fixed comments. diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi index ab65fd6..bc60bfe 100644 --- a/gcc/doc/extend.texi +++ b/gcc/doc/extend.texi @@ -13024,8 +13024,7 @@ aliases. @cindex pragma, weak This pragma declares @var{symbol} to be weak, as if the declaration had the attribute of the same name. The pragma may appear before -or after the declaration of @var{symbol}, but must appear before -either its first use or its definition. It is not an error for +or after the declaration of @var{symbol}. It is not an error for @var{symbol} to never be defined at all. @item #pragma weak @var{symbol1} = @var{symbol2} diff --git a/gcc/varasm.c b/gcc/varasm.c index bbebd87..afd9942 100644 --- a/gcc/varasm.c +++ b/gcc/varasm.c @@ -5139,20 +5139,16 @@ merge_weak (tree newdecl, tree olddecl) /* NEWDECL is weak, but OLDDECL is not. */ /* If we already output the OLDDECL, we're in trouble; we can't - go back and make it weak. This error cannot be caught in - declare_weak because the NEWDECL and OLDDECL was not yet - been merged; therefore, TREE_ASM_WRITTEN was not set. */ - if (TREE_ASM_WRITTEN (olddecl)) - error ("weak declaration of %q+D must precede definition", - newdecl); + go back and make it weak. This should never happen in + unit-at-a-time compilation. */ + gcc_assert (!TREE_ASM_WRITTEN (olddecl)); /* If we've already generated rtl referencing OLDDECL, we may have done so in a way that will not function properly with - a weak symbol. */ - else if (TREE_USED (olddecl) - && TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (olddecl))) - warning (0, "weak declaration of %q+D after first use results " - "in unspecified behavior", newdecl); + a weak symbol. Again in unit-at-a-time this should be + impossible. */ + gcc_assert (!TREE_USED (olddecl) + || !TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (olddecl))); if (TARGET_SUPPORTS_WEAK) { @@ -5184,10 +5180,9 @@ merge_weak (tree newdecl, tree olddecl) void declare_weak (tree decl) { + gcc_assert (TREE_CODE (decl) != FUNCTION_DECL || !TREE_ASM_WRITTEN (decl)); if (! TREE_PUBLIC (decl)) error ("weak declaration of %q+D must be public", decl); - else if (TREE_CODE (decl) == FUNCTION_DECL && TREE_ASM_WRITTEN (decl)) - error ("weak declaration of %q+D must precede definition", decl); else if (!TARGET_SUPPORTS_WEAK) warning (0, "weak declaration of %q+D not supported", decl); |