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
This commit is contained in:
David Pagan 2018-05-30 22:55:38 +00:00 committed by Jeff Law
parent e91c9fe500
commit b67b9225f7
8 changed files with 64 additions and 9 deletions

View 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.

View 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",

View 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

View 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. */

View 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

View 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.

View file

@ -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;
}

View file

@ -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;
}