Fix -Wreturn-type for static naked functions in C

Marek Polacek polacek@redhat.com
Tue Jul 16 20:58:00 GMT 2019


On Tue, Jul 16, 2019 at 09:50:31AM +0100, Richard Sandiford wrote:
> This patch extends the fix for PR53633 to include static functions,
> which were giving a bogus -Wreturn-type warning for C but not for C++.
> 
> Tested on aarch64-linux-gnu, x86_64-linux-gnu and armeb-eabi.
> OK for trunk?  OK for GCC 8 and 9 too?  I don't think it's
> a regression, but the current behaviour's very inconsistent
> and it's affecting real code.

Ok, thanks.

> 2019-07-16  Richard Sandiford  <richard.sandiford@arm.com>
> 
> gcc/c/
> 	PR c/53633
> 	* c-decl.c (finish_function): Check targetm.warn_func_return
> 	before issuing a -Wreturn-type warning.
> 
> gcc/testsuite/
> 	* c-c++-common/pr53633-2.c: New test.
> 
> Index: gcc/c/c-decl.c
> ===================================================================
> --- gcc/c/c-decl.c	2019-07-10 19:41:20.543944894 +0100
> +++ gcc/c/c-decl.c	2019-07-16 09:46:23.220645712 +0100
> @@ -9687,6 +9687,7 @@ finish_function (void)
>        /* Normally, with -Wreturn-type, flow will complain, but we might
>           optimize out static functions.  */
>        && !TREE_PUBLIC (fndecl)
> +      && targetm.warn_func_return (fndecl)
>        && warning (OPT_Wreturn_type,
>  		  "no return statement in function returning non-void"))
>      TREE_NO_WARNING (fndecl) = 1;
> Index: gcc/testsuite/c-c++-common/pr53633-2.c
> ===================================================================
> --- /dev/null	2019-06-14 15:59:19.298479944 +0100
> +++ gcc/testsuite/c-c++-common/pr53633-2.c	2019-07-16 09:46:23.220645712 +0100
> @@ -0,0 +1,19 @@
> +/* { dg-do compile } */
> +/* { dg-require-effective-target naked_functions } */
> +/* { dg-options "-O2 -Wall" } */
> +/* Check that we do not get warnings about missing return statements
> +   or bogus looking noreturn functions.  */
> +static int __attribute__((naked))
> +foo (void)
> +{
> +  __asm__ ("");
> +}
> +
> +static int __attribute__((naked,noreturn))
> +bar (void)
> +{
> +  __asm__ ("");
> +}
> +
> +int foo_caller (void) { return foo (); }
> +int bar_caller (void) { return bar (); }

Marek



More information about the Gcc-patches mailing list