]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c/21659 ([unit-at-a-time] "weak declaration must precede definition" error...
authorJan Hubicka <jh@suse.cz>
Mon, 24 Jan 2011 23:07:25 +0000 (00:07 +0100)
committerJan Hubicka <hubicka@gcc.gnu.org>
Mon, 24 Jan 2011 23:07:25 +0000 (23:07 +0000)
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

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

index 9a57795f512bd2be1e23ed614ddcc81a06369123..c61e513dc7dfb97536f3d306da468f71ca5f0beb 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 ab65fd6848e6a19d933e236e1aecc2b074f779b1..bc60bfe3f96f2829e423e16b9652eb0e60106c66 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 bbebd876bd08f729f7c642e3ca0ac6105605ffec..afd9942c2955b65bb4629b91beeb6c77500e961e 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);