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