Commit b67b9225 by David Pagan Committed by Jeff Law

re PR c/55976 (-Werror=return-type should error on returning a value from a void function)

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
parent e91c9fe5
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> 2018-05-29 Jason Merrill <jason@redhat.com>
* c.opt (Winit-list-lifetime): New flag. * c.opt (Winit-list-lifetime): New flag.
......
...@@ -994,8 +994,9 @@ c_common_post_options (const char **pfilename) ...@@ -994,8 +994,9 @@ c_common_post_options (const char **pfilename)
flag_extern_tls_init = 1; flag_extern_tls_init = 1;
} }
if (warn_return_type == -1) /* Enable by default only for C++ and C++ with ObjC extensions. */
warn_return_type = c_dialect_cxx (); if (warn_return_type == -1 && c_dialect_cxx ())
warn_return_type = 1;
if (num_in_fnames > 1) if (num_in_fnames > 1)
error ("too many filenames given. Type %s --help for usage", 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> 2018-05-18 Richard Sandiford <richard.sandiford@linaro.org>
* gimple-parser.c (c_parser_gimple_postfix_expression): Remove * gimple-parser.c (c_parser_gimple_postfix_expression): Remove
......
...@@ -5758,7 +5758,7 @@ grokdeclarator (const struct c_declarator *declarator, ...@@ -5758,7 +5758,7 @@ grokdeclarator (const struct c_declarator *declarator,
/* Issue a warning if this is an ISO C 99 program or if /* Issue a warning if this is an ISO C 99 program or if
-Wreturn-type and this is a function, or if -Wimplicit; -Wreturn-type and this is a function, or if -Wimplicit;
prefer the former warning since it is more explicit. */ 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) && funcdef_flag)
warn_about_return_type = 1; warn_about_return_type = 1;
else else
...@@ -8752,7 +8752,7 @@ start_function (struct c_declspecs *declspecs, struct c_declarator *declarator, ...@@ -8752,7 +8752,7 @@ start_function (struct c_declspecs *declspecs, struct c_declarator *declarator,
if (warn_about_return_type) if (warn_about_return_type)
warn_defaults_to (loc, flag_isoc99 ? OPT_Wimplicit_int 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), : OPT_Wimplicit_int),
"return type defaults to %<int%>"); "return type defaults to %<int%>");
...@@ -9463,8 +9463,9 @@ finish_function (void) ...@@ -9463,8 +9463,9 @@ finish_function (void)
finish_fname_decls (); finish_fname_decls ();
/* Complain if there's just no return statement. */ /* Complain if there's no return statement only if option specified on
if (warn_return_type command line. */
if (warn_return_type > 0
&& TREE_CODE (TREE_TYPE (TREE_TYPE (fndecl))) != VOID_TYPE && TREE_CODE (TREE_TYPE (TREE_TYPE (fndecl))) != VOID_TYPE
&& !current_function_returns_value && !current_function_returns_null && !current_function_returns_value && !current_function_returns_null
/* Don't complain if we are no-return. */ /* Don't complain if we are no-return. */
......
...@@ -10133,13 +10133,13 @@ c_finish_return (location_t loc, tree retval, tree origtype) ...@@ -10133,13 +10133,13 @@ c_finish_return (location_t loc, tree retval, tree origtype)
if (!retval) if (!retval)
{ {
current_function_returns_null = 1; 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) && valtype != NULL_TREE && TREE_CODE (valtype) != VOID_TYPE)
{ {
bool warned_here; bool warned_here;
if (flag_isoc99) if (flag_isoc99)
warned_here = pedwarn warned_here = pedwarn
(loc, 0, (loc, warn_return_type >= 0 ? OPT_Wreturn_type : 0,
"%<return%> with no value, in function returning non-void"); "%<return%> with no value, in function returning non-void");
else else
warned_here = warning_at warned_here = warning_at
...@@ -10157,7 +10157,7 @@ c_finish_return (location_t loc, tree retval, tree origtype) ...@@ -10157,7 +10157,7 @@ c_finish_return (location_t loc, tree retval, tree origtype)
bool warned_here; bool warned_here;
if (TREE_CODE (TREE_TYPE (retval)) != VOID_TYPE) if (TREE_CODE (TREE_TYPE (retval)) != VOID_TYPE)
warned_here = pedwarn warned_here = pedwarn
(xloc, 0, (xloc, warn_return_type >= 0 ? OPT_Wreturn_type : 0,
"%<return%> with a value, in function returning void"); "%<return%> with a value, in function returning void");
else else
warned_here = pedwarn 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> 2018-05-30 Jan Hubicka <hubicka@ucw.cz>
* gcc.dg/lto/20111213-1_0.c: Fix template. * gcc.dg/lto/20111213-1_0.c: Fix template.
......
/* 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;
}
/* 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;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment