Fix -Wreturn-type for static naked functions in C
authorRichard Sandiford <richard.sandiford@arm.com>
Thu, 18 Jul 2019 08:22:50 +0000 (08:22 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Thu, 18 Jul 2019 08:22:50 +0000 (08:22 +0000)
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++.

2019-07-18  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.

From-SVN: r273568

gcc/c/ChangeLog
gcc/c/c-decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/c-c++-common/pr53633-2.c [new file with mode: 0644]

index 927fa914bfb6581b29dfb6fc9f272a33e85fca1e..ee0c55970a2ae9ea53bdac0d94b763cf1654584c 100644 (file)
@@ -1,3 +1,9 @@
+2019-07-18  Richard Sandiford  <richard.sandiford@arm.com>
+
+       PR c/53633
+       * c-decl.c (finish_function): Check targetm.warn_func_return
+       before issuing a -Wreturn-type warning.
+
 2019-07-12  Alexandre Oliva <oliva@adacore.com>
 
        * gimple-parser.c (c_parser_gimple_try_stmt): New.
index d75648aa27384016a848f8ecf6875f5152ff4a99..0d107adf85f6e2729de6db60702cf34df63cab12 100644 (file)
@@ -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 69e82b59a9e1cbc061f6089f7c8bcf626c06b46e..f9f17893295d26ebdbfa7f368dcb2e78b66576c0 100644 (file)
@@ -1,3 +1,7 @@
+2019-07-18  Richard Sandiford  <richard.sandiford@arm.com>
+
+       * c-c++-common/pr53633-2.c: New test.
+
 2019-07-17  Alexandre Oliva <oliva@adacore.com>
 
        PR middle-end/81824
diff --git a/gcc/testsuite/c-c++-common/pr53633-2.c b/gcc/testsuite/c-c++-common/pr53633-2.c
new file mode 100644 (file)
index 0000000..c26cb10
--- /dev/null
@@ -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 (); }