In C99, one way how to deal with inline functions is to put definition
of the function into header:
inline void foo (void) { /* ... */ }
and put the declaration into exactly one .c file, with extern keyword
(it can also have inline keyword):
extern void foo (void);
But in this case, we shouldn't issue the "missing prototype" warning.
So the following should suppress that warning in C99 mode, when
-fgnu89-inline is not in effect.  (But the function could still have
the gnu_inline attribute, so it might be better to disable that
warning for all inline functions?)

Regtested/bootstrapped on x86_64-unknown-linux-gnu.  Ok for trunk?

2013-12-04  Marek Polacek  <pola...@redhat.com>

        PR c/54113
c/
        * c-decl.c (start_function): Don't warn for missing prototype for
        inline functions in C99+.
testsuite/
        * gcc.dg/pr54113.c: New test.

--- gcc/c/c-decl.c.mp3  2013-12-04 17:11:43.063878926 +0100
+++ gcc/c/c-decl.c      2013-12-04 18:32:17.567008028 +0100
@@ -7974,7 +7974,10 @@ start_function (struct c_declspecs *decl
           && old_decl != error_mark_node
           && TREE_PUBLIC (decl1)
           && !MAIN_NAME_P (DECL_NAME (decl1))
-          && C_DECL_ISNT_PROTOTYPE (old_decl))
+          && C_DECL_ISNT_PROTOTYPE (old_decl)
+          && !(DECL_DECLARED_INLINE_P (decl1)
+               && flag_isoc99
+               && !flag_gnu89_inline))
     warning_at (loc, OPT_Wmissing_prototypes,
                "no previous prototype for %qD", decl1);
   /* Optionally warn of any def with no previous prototype
--- gcc/testsuite/gcc.dg/pr54113.c.mp3  2013-12-04 17:52:45.671288940 +0100
+++ gcc/testsuite/gcc.dg/pr54113.c      2013-12-04 17:36:43.000000000 +0100
@@ -0,0 +1,5 @@
+/* { dg-do compile } */
+/* { dg-options "-std=c99" } */
+
+inline int foo (void) { return 42; } /* { dg-bogus "no previous prototype" } */
+extern int foo(void);

        Marek

Reply via email to