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 <[email protected]>
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