re PR c/55976 (-Werror=return-type should error on returning a value from a void...
authorDavid Pagan <dave.pagan@oracle.com>
Wed, 30 May 2018 22:55:38 +0000 (22:55 +0000)
committerJeff Law <law@gcc.gnu.org>
Wed, 30 May 2018 22:55:38 +0000 (16:55 -0600)
2018-05-30  David Pagan  <dave.pagan@oracle.com>

PR c/55976
* c-decl.c (grokdeclarator): Update check for return type warnings.
(start_function): Likewise.
(finish_function): Likewise.
* c-typeck.c (c_finish_return): Update check for return type warnings.
Pass OPT_Wreturn_type to pedwarn when appropriate.

PR c/55976
* c-opts.c (c_common_post_options): Set default for warn_return_type
for C++/C++ with ObjC extensions only. For C, makes it possible to
differentiate between default (no option), -Wreturn-type, and
-Wno-return-type.

PR c/55976
* gcc.dg/noncompile/pr55976-1.c: New test.
* gcc.dg/noncompile/pr55976-2.c: New test.

From-SVN: r260978

gcc/c-family/ChangeLog
gcc/c-family/c-opts.c
gcc/c/ChangeLog
gcc/c/c-decl.c
gcc/c/c-typeck.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/noncompile/pr55976-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/noncompile/pr55976-2.c [new file with mode: 0644]

index cb6ee1319c7a93b39348ba61dcf8a5fb8542d7c6..d7f68046c222a09435eced577dd8e4bdf18f61ec 100644 (file)
@@ -1,3 +1,11 @@
+2018-04-22  David Pagan  <dave.pagan@oracle.com>
+
+       PR c/55976
+       * c-opts.c (c_common_post_options): Set default for warn_return_type
+       for C++/C++ with ObjC extensions only. For C, makes it possible to 
+       differentiate between default (no option), -Wreturn-type, and
+       -Wno-return-type.
+
 2018-05-29  Jason Merrill  <jason@redhat.com>
 
        * c.opt (Winit-list-lifetime): New flag.
index 3db01d453a6864b1f6055f0df9c98b0fb8416288..ddaaef37e1d47166270e521632fbe68ad6dd4e0c 100644 (file)
@@ -994,8 +994,9 @@ c_common_post_options (const char **pfilename)
        flag_extern_tls_init = 1;
     }
 
-  if (warn_return_type == -1)
-    warn_return_type = c_dialect_cxx ();
+  /* Enable by default only for C++ and C++ with ObjC extensions.  */
+  if (warn_return_type == -1 && c_dialect_cxx ())
+    warn_return_type = 1;
 
   if (num_in_fnames > 1)
     error ("too many filenames given.  Type %s --help for usage",
index f3a387de226a4236b4abe6d9f0b1ae165139725a..1be683d2c81379547e4f5d7a06abb7de7bb602ba 100644 (file)
@@ -1,3 +1,12 @@
+2018-05-30  David Pagan  <dave.pagan@oracle.com>
+
+       PR c/55976
+       * c-decl.c (grokdeclarator): Update check for return type warnings.
+       (start_function): Likewise.
+       (finish_function): Likewise.
+       * c-typeck.c (c_finish_return): Update check for return type warnings.
+       Pass OPT_Wreturn_type to pedwarn when appropriate.
+
 2018-05-18  Richard Sandiford  <richard.sandiford@linaro.org>
 
        * gimple-parser.c (c_parser_gimple_postfix_expression): Remove
index 3c4b18edf562b18a108e48df20d3bec0713377ee..54f58a56cde6db5b33e905d4e6b86e94ae9c3913 100644 (file)
@@ -5758,7 +5758,7 @@ grokdeclarator (const struct c_declarator *declarator,
       /* Issue a warning if this is an ISO C 99 program or if
         -Wreturn-type and this is a function, or if -Wimplicit;
         prefer the former warning since it is more explicit.  */
-      if ((warn_implicit_int || warn_return_type || flag_isoc99)
+      if ((warn_implicit_int || warn_return_type > 0 || flag_isoc99)
          && funcdef_flag)
        warn_about_return_type = 1;
       else
@@ -8752,7 +8752,7 @@ start_function (struct c_declspecs *declspecs, struct c_declarator *declarator,
 
   if (warn_about_return_type)
     warn_defaults_to (loc, flag_isoc99 ? OPT_Wimplicit_int
-                          : (warn_return_type ? OPT_Wreturn_type
+                          : (warn_return_type > 0 ? OPT_Wreturn_type
                              : OPT_Wimplicit_int),
                      "return type defaults to %<int%>");
 
@@ -9463,8 +9463,9 @@ finish_function (void)
 
   finish_fname_decls ();
 
-  /* Complain if there's just no return statement.  */
-  if (warn_return_type
+  /* Complain if there's no return statement only if option specified on
+     command line.  */
+  if (warn_return_type > 0
       && TREE_CODE (TREE_TYPE (TREE_TYPE (fndecl))) != VOID_TYPE
       && !current_function_returns_value && !current_function_returns_null
       /* Don't complain if we are no-return.  */
index 45a4529ed520b20ec61cbc6496bf60fccb952c76..f346eaef031181c9078c359469968dc3b820f9eb 100644 (file)
@@ -10133,13 +10133,13 @@ c_finish_return (location_t loc, tree retval, tree origtype)
   if (!retval)
     {
       current_function_returns_null = 1;
-      if ((warn_return_type || flag_isoc99)
+      if ((warn_return_type >= 0 || flag_isoc99)
          && valtype != NULL_TREE && TREE_CODE (valtype) != VOID_TYPE)
        {
          bool warned_here;
          if (flag_isoc99)
            warned_here = pedwarn
-             (loc, 0,
+             (loc, warn_return_type >= 0 ? OPT_Wreturn_type : 0,
               "%<return%> with no value, in function returning non-void");
          else
            warned_here = warning_at
@@ -10157,7 +10157,7 @@ c_finish_return (location_t loc, tree retval, tree origtype)
       bool warned_here;
       if (TREE_CODE (TREE_TYPE (retval)) != VOID_TYPE)
        warned_here = pedwarn
-         (xloc, 0,
+         (xloc, warn_return_type >= 0 ? OPT_Wreturn_type : 0,
           "%<return%> with a value, in function returning void");
       else
        warned_here = pedwarn
index 9aa35c8900ddcc9761deb31375ac4933b4e7ff64..338cbb254b3bf973d6b854f0e526f5ee5b5b6c17 100644 (file)
@@ -1,3 +1,9 @@
+2018-05-30  David Pagan  <dave.pagan@oracle.com>
+
+       PR c/55976
+       * gcc.dg/noncompile/pr55976-1.c: New test.
+       * gcc.dg/noncompile/pr55976-2.c: New test.
+
 2018-05-30  Jan Hubicka  <hubicka@ucw.cz>
 
        * gcc.dg/lto/20111213-1_0.c: Fix template.
diff --git a/gcc/testsuite/gcc.dg/noncompile/pr55976-1.c b/gcc/testsuite/gcc.dg/noncompile/pr55976-1.c
new file mode 100644 (file)
index 0000000..b3e6328
--- /dev/null
@@ -0,0 +1,14 @@
+/* PR c/55976 */
+/* { dg-do compile } */
+/* { dg-options "-Werror=return-type" } */
+
+/* Verify warnings for return type become errors.  */
+
+void t () { return 1; } /* { dg-error "return" "function returning void" } */
+int b () { return; } /* { dg-error "return" "function returning non-void" } */
+
+int main()
+{
+  t(); b();
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/noncompile/pr55976-2.c b/gcc/testsuite/gcc.dg/noncompile/pr55976-2.c
new file mode 100644 (file)
index 0000000..0e493d0
--- /dev/null
@@ -0,0 +1,16 @@
+/* PR c/55976 */
+/* { dg-do compile } */
+/* { dg-options "-Wno-return-type" } */
+
+/* Verify that -Wno-return-type turns off warnings about function return
+   type.  */
+
+void t () { return 1; } /* normally generates function returning void */
+int b () { return; } /* normally generates function returning non-void */
+
+int main()
+{
+  t (); b ();
+  return 0;
+}
+