This patch fixes PR c/48116.

The bug is that -Wreturn-type does not follow the documentation.  In
particular, it should warn for this code, but does not:

    static void f() {}
    static void g() { return f(); }

I think the bug is that c-typeck.c calls pedwarn with either 0 or
OPT_pedantic, but it should use OPT_Wreturn_type in some cases.

I am not completely sure this is the correct patch.  In particular, this
patch chooses to report -Wreturn-type over -pedantic, e.g.:

    opsy. gcc -pedantic -Wreturn-type --syntax-only q.c
    q.c: In function ‘y’:
    q.c:3:16: warning: ISO C forbids ‘return’ with expression, in function 
returning void [-Wreturn-type]

This is a somewhat odd situation, in that both -Wreturn-type and
-pedantic must be disabled to eliminate this message.

Also, arguably there should be a different message when -pedantic is not
given.

Bootstrapped and regtested on x86-64 (compile farm).
New test case included.

I did not check to see whether this is a regression.

Tom

2011-03-16  Tom Tromey  <tro...@redhat.com>

        PR c/48116
        * c-typeck.c (c_finish_return): Check warn_return_type.

2011-03-16  Tom Tromey  <tro...@redhat.com>

        * gcc.dg/Wreturn-type3.c: New file.

Index: c-typeck.c
===================================================================
--- c-typeck.c  (revision 170953)
+++ c-typeck.c  (working copy)
@@ -8628,10 +8628,11 @@
     {
       current_function_returns_null = 1;
       if (TREE_CODE (TREE_TYPE (retval)) != VOID_TYPE)
-       pedwarn (loc, 0,
+       pedwarn (loc, warn_return_type ? OPT_Wreturn_type : 0,
                 "%<return%> with a value, in function returning void");
       else
-       pedwarn (loc, OPT_pedantic, "ISO C forbids "
+       pedwarn (loc, warn_return_type ? OPT_Wreturn_type : OPT_pedantic,
+                "ISO C forbids "
                 "%<return%> with expression, in function returning void");
     }
   else
Index: testsuite/gcc.dg/Wreturn-type3.c
===================================================================
--- testsuite/gcc.dg/Wreturn-type3.c    (revision 0)
+++ testsuite/gcc.dg/Wreturn-type3.c    (revision 0)
@@ -0,0 +1,6 @@
+/* PR c/48116 */
+/* { dg-do compile } */
+/* { dg-options "-Wreturn-type" } */
+
+static void f() {}
+static void g() { return f(); }        /* { dg-warning "forbids .return" 
"missing return" } */

Reply via email to