OSDN Git Service

PR c/21659
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 24 Jan 2011 23:07:25 +0000 (23:07 +0000)
committerhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 24 Jan 2011 23:07:25 +0000 (23:07 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@169184 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/doc/extend.texi
gcc/varasm.c

index 9a57795..c61e513 100644 (file)
@@ -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.
index ab65fd6..bc60bfe 100644 (file)
@@ -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}
index bbebd87..afd9942 100644 (file)
@@ -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);