+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.
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",
+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
/* 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
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%>");
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. */
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
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
+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.
--- /dev/null
+/* 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;
+}
--- /dev/null
+/* 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;
+}
+