Hi!

We ICE on the following testcase, because C nested functions are turned into
!TREE_PUBLIC ones very soon,  and the IPA code asserts that DECL_WEAK functions
are either TREE_PUBLIC or DECL_EXTERNAL.
As we reject static __attribute__((weak)) void foo () {}, I think we should
reject weak nested functions, they don't make much sense either, they are
TU local too.

The following patch fixes that.  The other effect of the patch is that leaf
attribute is warned and ignored on the nested function, but similarly, we
ignore and warn for leaf attribute on other TU local functions, we see the
nested function body and can analyze everything in it.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2019-02-14  Jakub Jelinek  <ja...@redhat.com>

        PR c/89340
        * c-decl.c (start_function): Clear TREE_PUBLIC on nested functions
        before c_decl_attributes rather than after it.

        * gcc.dg/pr89340.c: New test.
        * gcc.dg/torture/pr57036-2.c (jpgDecode_convert): Expect a warning
        that leaf attribute on nested function is useless.

--- gcc/c/c-decl.c.jj   2019-02-06 09:53:49.000000000 +0100
+++ gcc/c/c-decl.c      2019-02-14 14:03:23.630109817 +0100
@@ -8904,6 +8904,10 @@ start_function (struct c_declspecs *decl
 
   loc = DECL_SOURCE_LOCATION (decl1);
 
+  /* A nested function is not global.  */
+  if (current_function_decl != NULL_TREE)
+    TREE_PUBLIC (decl1) = 0;
+
   c_decl_attributes (&decl1, attributes, 0);
 
   if (DECL_DECLARED_INLINE_P (decl1)
@@ -8945,10 +8949,6 @@ start_function (struct c_declspecs *decl
      error_mark_node is replaced below (in pop_scope) with the BLOCK.  */
   DECL_INITIAL (decl1) = error_mark_node;
 
-  /* A nested function is not global.  */
-  if (current_function_decl != NULL_TREE)
-    TREE_PUBLIC (decl1) = 0;
-
   /* If this definition isn't a prototype and we had a prototype declaration
      before, copy the arg type info from that prototype.  */
   old_decl = lookup_name_in_scope (DECL_NAME (decl1), current_scope);
--- gcc/testsuite/gcc.dg/pr89340.c.jj   2019-02-14 14:16:35.998034363 +0100
+++ gcc/testsuite/gcc.dg/pr89340.c      2019-02-14 14:10:31.936033775 +0100
@@ -0,0 +1,9 @@
+/* PR c/89340 */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+void bar (void)
+{
+  __attribute__((weak)) void foo () {} /* { dg-error "weak declaration of 
'foo' must be public" } */
+  foo ();
+}
--- gcc/testsuite/gcc.dg/torture/pr57036-2.c.jj 2014-11-11 00:06:07.247079690 
+0100
+++ gcc/testsuite/gcc.dg/torture/pr57036-2.c    2019-02-14 22:04:04.936850407 
+0100
@@ -9,7 +9,7 @@ int jpgDecode_convert (unsigned i)
   int j;
 
   inline void __attribute__((always_inline,leaf)) f(void)
-    {
+    {          /* { dg-warning "'leaf' attribute has no effect" } */
       g();
     }
 

        Jakub

Reply via email to