This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] Don't warn for missing prototypes on inline fns (PR c/54113)
- From: Marek Polacek <polacek at redhat dot com>
- To: Jakub Jelinek <jakub at redhat dot com>
- Cc: GCC Patches <gcc-patches at gcc dot gnu dot org>, "Joseph S. Myers" <joseph at codesourcery dot com>
- Date: Wed, 4 Dec 2013 19:20:48 +0100
- Subject: Re: [PATCH] Don't warn for missing prototypes on inline fns (PR c/54113)
- Authentication-results: sourceware.org; auth=none
- References: <20131204174709 dot GH32420 at redhat dot com> <20131204175552 dot GW892 at tucnak dot redhat dot com>
On Wed, Dec 04, 2013 at 06:55:52PM +0100, Jakub Jelinek wrote:
> On Wed, Dec 04, 2013 at 06:47:09PM +0100, Marek Polacek wrote:
> > 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?)
>
> A function definition can't have attributes after the (), and
> start_function is called with the attributes argument, so you can just
> look through those for gnu_inline attribute.
I can, the question is whether we want that. Anyway, this is version
which looks for the gnu_inline attribute.
2013-12-04 Marek Polacek <polacek@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 19:13:29.043160116 +0100
@@ -7974,7 +7974,12 @@ 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
+ && !lookup_attribute ("gnu_inline",
+ DECL_ATTRIBUTES (decl1))))
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 18:48:31.012682675 +0100
@@ -0,0 +1,5 @@
+/* { dg-do compile } */
+/* { dg-options "-std=c99 -Wmissing-prototypes" } */
+
+inline int foo (void) { return 42; } /* { dg-bogus "no previous prototype" } */
+extern int foo(void);
Marek