mirror of git://gcc.gnu.org/git/gcc.git
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
This commit is contained in:
parent
71c67403a2
commit
e8ba94fc1f
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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}
|
||||
|
|
|
|||
21
gcc/varasm.c
21
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);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue