diff mbox series

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

Message ID ccc21947-dd32-0f0a-8aa3-70ae9e255423@oracle.com
State New
Headers show
Series c/55976 -Werror=return-type should error on returning a value from a void function | expand

Commit Message

dave.pagan@oracle.com April 22, 2018, 7:17 p.m. UTC
This patch fixes handling of -Werror=return-type as well as 
-Wno-return-type. Currently, -Werror=return-type does not turn the 
warnings into errors and -Wno-return-type does not turn off 
warning/error. Now they both work as expected.

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=55976

Initialize warn_return_type only for C++/C++ with ObjC extensions. In C, 
this allows us to differentiate between default (no option), or cases 
where -Wreturn-type/-Wno-return-type are specified. Elsewhere, update 
references to warn_return_type (for C) to reflect change in initialization.

Patch was successfully bootstrapped and tested on x86_64-linux.

--Dave
/c
2018-04-22  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.
	* 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.

/testsuite
2018-04-22  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.

Comments

dave.pagan@oracle.com May 24, 2018, 2:51 a.m. UTC | #1
Ping for the following C patch sent on 4/22/2018

https://gcc.gnu.org/ml/gcc-patches/2018-04/msg01034.html

Thanks,

--Dave

==========

On 04/22/2018 12:17 PM, dave.pagan@oracle.com wrote:
> This patch fixes handling of -Werror=return-type as well as 
> -Wno-return-type. Currently, -Werror=return-type does not turn the 
> warnings into errors and -Wno-return-type does not turn off 
> warning/error. Now they both work as expected.
>
> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=55976
>
> Initialize warn_return_type only for C++/C++ with ObjC extensions. In 
> C, this allows us to differentiate between default (no option), or 
> cases where -Wreturn-type/-Wno-return-type are specified. Elsewhere, 
> update references to warn_return_type (for C) to reflect change in 
> initialization.
>
> Patch was successfully bootstrapped and tested on x86_64-linux.
>
> --Dave
>
Jeff Law May 30, 2018, 10:56 p.m. UTC | #2
On 04/22/2018 01:17 PM, dave.pagan@oracle.com wrote:
> This patch fixes handling of -Werror=return-type as well as
> -Wno-return-type. Currently, -Werror=return-type does not turn the
> warnings into errors and -Wno-return-type does not turn off
> warning/error. Now they both work as expected.
> 
> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=55976
> 
> Initialize warn_return_type only for C++/C++ with ObjC extensions. In C,
> this allows us to differentiate between default (no option), or cases
> where -Wreturn-type/-Wno-return-type are specified. Elsewhere, update
> references to warn_return_type (for C) to reflect change in initialization.
> 
> Patch was successfully bootstrapped and tested on x86_64-linux.
> 
> --Dave
> 
> 
> CL-55976
> 
> 
> /c
> 2018-04-22  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.
> 	* 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.
> 
> /testsuite
> 2018-04-22  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.
THanks.  Installed on the trunk.

Sorry for the long delay,
Jeff
H.J. Lu May 31, 2018, 12:53 p.m. UTC | #3
On Wed, May 30, 2018 at 3:56 PM, Jeff Law <law@redhat.com> wrote:
> On 04/22/2018 01:17 PM, dave.pagan@oracle.com wrote:
>> This patch fixes handling of -Werror=return-type as well as
>> -Wno-return-type. Currently, -Werror=return-type does not turn the
>> warnings into errors and -Wno-return-type does not turn off
>> warning/error. Now they both work as expected.
>>
>> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=55976
>>
>> Initialize warn_return_type only for C++/C++ with ObjC extensions. In C,
>> this allows us to differentiate between default (no option), or cases
>> where -Wreturn-type/-Wno-return-type are specified. Elsewhere, update
>> references to warn_return_type (for C) to reflect change in initialization.
>>
>> Patch was successfully bootstrapped and tested on x86_64-linux.
>>
>> --Dave
>>
>>
>> CL-55976
>>
>>
>> /c
>> 2018-04-22  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.
>>       * 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.
>>
>> /testsuite
>> 2018-04-22  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.
> THanks.  Installed on the trunk.
>

On x86, I got

FAIL: gcc.dg/noncompile/pr55976-1.c   -O0  (test for excess errors)
FAIL: gcc.dg/noncompile/pr55976-1.c   -O1  (test for excess errors)
FAIL: gcc.dg/noncompile/pr55976-1.c   -O2 -flto -fno-use-linker-plugin
-flto-partition=none  (test for excess errors)
FAIL: gcc.dg/noncompile/pr55976-1.c   -O2 -flto -fuse-linker-plugin
-fno-fat-lto-objects  (test for excess errors)
FAIL: gcc.dg/noncompile/pr55976-1.c   -O2  (test for excess errors)
FAIL: gcc.dg/noncompile/pr55976-1.c   -O3 -g  (test for excess errors)
FAIL: gcc.dg/noncompile/pr55976-1.c   -Os  (test for excess errors)

[hjl@gnu-skx-1 testsuite]$
/export/ssd/git/gcc-test-native/bld/gcc/xgcc
-B/export/ssd/git/gcc-test-native/bld/gcc/
/export/ssd/git/gcc-test-native/src-trunk/gcc/testsuite/gcc.dg/noncompile/pr55976-1.c
-mx32 -B/export/ssd/git/gcc-test-native/bld/x86_64-pc-linux-gnu/32/libmpx/
-B/export/ssd/git/gcc-test-native/bld/x86_64-pc-linux-gnu/32/libmpx/mpxrt
-L/export/ssd/git/gcc-test-native/bld/x86_64-pc-linux-gnu/32/libmpx/mpxrt/.libs
-B/export/ssd/git/gcc-test-native/bld/x86_64-pc-linux-gnu/32/libmpx/
-B/export/ssd/git/gcc-test-native/bld/x86_64-pc-linux-gnu/32/libmpx/mpxwrap
-L/export/ssd/git/gcc-test-native/bld/x86_64-pc-linux-gnu/32/libmpx/mpxwrap/.libs
-fno-diagnostics-show-caret -fdiagnostics-color=never -O2 -flto
-fuse-linker-plugin -fno-fat-lto-objects -Werror=return-type -S -o
pr55976-1.s
/export/ssd/git/gcc-test-native/src-trunk/gcc/testsuite/gcc.dg/noncompile/pr55976-1.c:
In function \u2018t\u2019:
/export/ssd/git/gcc-test-native/src-trunk/gcc/testsuite/gcc.dg/noncompile/pr55976-1.c:7:20:
error: \u2018return\u2019 with a value, in function returning void
[-Werror=return-type]
/export/ssd/git/gcc-test-native/src-trunk/gcc/testsuite/gcc.dg/noncompile/pr55976-1.c:7:6:
note: declared here
/export/ssd/git/gcc-test-native/src-trunk/gcc/testsuite/gcc.dg/noncompile/pr55976-1.c:
In function \u2018b\u2019:
/export/ssd/git/gcc-test-native/src-trunk/gcc/testsuite/gcc.dg/noncompile/pr55976-1.c:8:12:
error: \u2018return\u2019 with no value, in function returning
non-void [-Werror=return-type]
/export/ssd/git/gcc-test-native/src-trunk/gcc/testsuite/gcc.dg/noncompile/pr55976-1.c:8:5:
note: declared here
cc1: some warnings being treated as errors
[hjl@gnu-skx-1 testsuite]$
dave.pagan@oracle.com June 1, 2018, 9:08 p.m. UTC | #4
Thanks for pointing this out. I'll check out what's going on and fix the 
issue

--Dave

On 05/31/2018 05:53 AM, H.J. Lu wrote:
> On Wed, May 30, 2018 at 3:56 PM, Jeff Law <law@redhat.com> wrote:
>> On 04/22/2018 01:17 PM, dave.pagan@oracle.com wrote:
>>> This patch fixes handling of -Werror=return-type as well as
>>> -Wno-return-type. Currently, -Werror=return-type does not turn the
>>> warnings into errors and -Wno-return-type does not turn off
>>> warning/error. Now they both work as expected.
>>>
>>> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=55976
>>>
>>> Initialize warn_return_type only for C++/C++ with ObjC extensions. In C,
>>> this allows us to differentiate between default (no option), or cases
>>> where -Wreturn-type/-Wno-return-type are specified. Elsewhere, update
>>> references to warn_return_type (for C) to reflect change in initialization.
>>>
>>> Patch was successfully bootstrapped and tested on x86_64-linux.
>>>
>>> --Dave
>>>
>>>
>>> CL-55976
>>>
>>>
>>> /c
>>> 2018-04-22  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.
>>>        * 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.
>>>
>>> /testsuite
>>> 2018-04-22  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.
>> THanks.  Installed on the trunk.
>>
> On x86, I got
>
> FAIL: gcc.dg/noncompile/pr55976-1.c   -O0  (test for excess errors)
> FAIL: gcc.dg/noncompile/pr55976-1.c   -O1  (test for excess errors)
> FAIL: gcc.dg/noncompile/pr55976-1.c   -O2 -flto -fno-use-linker-plugin
> -flto-partition=none  (test for excess errors)
> FAIL: gcc.dg/noncompile/pr55976-1.c   -O2 -flto -fuse-linker-plugin
> -fno-fat-lto-objects  (test for excess errors)
> FAIL: gcc.dg/noncompile/pr55976-1.c   -O2  (test for excess errors)
> FAIL: gcc.dg/noncompile/pr55976-1.c   -O3 -g  (test for excess errors)
> FAIL: gcc.dg/noncompile/pr55976-1.c   -Os  (test for excess errors)
>
> [hjl@gnu-skx-1 testsuite]$
> /export/ssd/git/gcc-test-native/bld/gcc/xgcc
> -B/export/ssd/git/gcc-test-native/bld/gcc/
> /export/ssd/git/gcc-test-native/src-trunk/gcc/testsuite/gcc.dg/noncompile/pr55976-1.c
> -mx32 -B/export/ssd/git/gcc-test-native/bld/x86_64-pc-linux-gnu/32/libmpx/
> -B/export/ssd/git/gcc-test-native/bld/x86_64-pc-linux-gnu/32/libmpx/mpxrt
> -L/export/ssd/git/gcc-test-native/bld/x86_64-pc-linux-gnu/32/libmpx/mpxrt/.libs
> -B/export/ssd/git/gcc-test-native/bld/x86_64-pc-linux-gnu/32/libmpx/
> -B/export/ssd/git/gcc-test-native/bld/x86_64-pc-linux-gnu/32/libmpx/mpxwrap
> -L/export/ssd/git/gcc-test-native/bld/x86_64-pc-linux-gnu/32/libmpx/mpxwrap/.libs
> -fno-diagnostics-show-caret -fdiagnostics-color=never -O2 -flto
> -fuse-linker-plugin -fno-fat-lto-objects -Werror=return-type -S -o
> pr55976-1.s
> /export/ssd/git/gcc-test-native/src-trunk/gcc/testsuite/gcc.dg/noncompile/pr55976-1.c:
> In function \u2018t\u2019:
> /export/ssd/git/gcc-test-native/src-trunk/gcc/testsuite/gcc.dg/noncompile/pr55976-1.c:7:20:
> error: \u2018return\u2019 with a value, in function returning void
> [-Werror=return-type]
> /export/ssd/git/gcc-test-native/src-trunk/gcc/testsuite/gcc.dg/noncompile/pr55976-1.c:7:6:
> note: declared here
> /export/ssd/git/gcc-test-native/src-trunk/gcc/testsuite/gcc.dg/noncompile/pr55976-1.c:
> In function \u2018b\u2019:
> /export/ssd/git/gcc-test-native/src-trunk/gcc/testsuite/gcc.dg/noncompile/pr55976-1.c:8:12:
> error: \u2018return\u2019 with no value, in function returning
> non-void [-Werror=return-type]
> /export/ssd/git/gcc-test-native/src-trunk/gcc/testsuite/gcc.dg/noncompile/pr55976-1.c:8:5:
> note: declared here
> cc1: some warnings being treated as errors
> [hjl@gnu-skx-1 testsuite]$
>
Martin Liška June 7, 2018, 11:19 a.m. UTC | #5
On 06/01/2018 11:08 PM, dave.pagan@oracle.com wrote:
> Thanks for pointing this out. I'll check out what's going on and fix the issue
> 
> --Dave

Hi.

Difference is in between C and C++ FEs:

marxin@marxinbox:/dev/shm/objdir/gcc> ./xgcc -B. /home/marxin/Programming/gcc/gcc/testsuite/gcc.dg/noncompile/pr55976-1.c
/home/marxin/Programming/gcc/gcc/testsuite/gcc.dg/noncompile/pr55976-1.c: In function ‘t’:
/home/marxin/Programming/gcc/gcc/testsuite/gcc.dg/noncompile/pr55976-1.c:7:20: warning: ‘return’ with a value, in function returning void
 void t () { return 1; } /* { dg-error "return" "function returning void" } */
                    ^
/home/marxin/Programming/gcc/gcc/testsuite/gcc.dg/noncompile/pr55976-1.c:7:6: note: declared here
 void t () { return 1; } /* { dg-error "return" "function returning void" } */
      ^
/home/marxin/Programming/gcc/gcc/testsuite/gcc.dg/noncompile/pr55976-1.c: In function ‘b’:
/home/marxin/Programming/gcc/gcc/testsuite/gcc.dg/noncompile/pr55976-1.c:8:12: warning: ‘return’ with no value, in function returning non-void
 int b () { return; } /* { dg-error "return" "function returning non-void" } */
            ^~~~~~
/home/marxin/Programming/gcc/gcc/testsuite/gcc.dg/noncompile/pr55976-1.c:8:5: note: declared here
 int b () { return; } /* { dg-error "return" "function returning non-void" } */
     ^
marxin@marxinbox:/dev/shm/objdir/gcc> ./xg++ -B. /home/marxin/Programming/gcc/gcc/testsuite/gcc.dg/noncompile/pr55976-1.c
/home/marxin/Programming/gcc/gcc/testsuite/gcc.dg/noncompile/pr55976-1.c: In function ‘void t()’:
/home/marxin/Programming/gcc/gcc/testsuite/gcc.dg/noncompile/pr55976-1.c:7:20: error: return-statement with a value, in function returning ‘void’ [-fpermissive]
 void t () { return 1; } /* { dg-error "return" "function returning void" } */
                    ^
/home/marxin/Programming/gcc/gcc/testsuite/gcc.dg/noncompile/pr55976-1.c: In function ‘int b()’:
/home/marxin/Programming/gcc/gcc/testsuite/gcc.dg/noncompile/pr55976-1.c:8:12: error: return-statement with no value, in function returning ‘int’ [-fpermissive]
 int b () { return; } /* { dg-error "return" "function returning non-void" } */
            ^~~~~~

Martin
diff mbox series

Patch

Index: gcc/c/c-decl.c
===================================================================
--- gcc/c/c-decl.c	(revision 259017)
+++ gcc/c/c-decl.c	(working copy)
@@ -5745,7 +5745,7 @@  grokdeclarator (const struct c_declarator *declara
       /* 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
@@ -8739,7 +8739,7 @@  start_function (struct c_declspecs *declspecs, str
 
   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%>");
 
@@ -9450,8 +9450,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: gcc/c/c-typeck.c
===================================================================
--- gcc/c/c-typeck.c	(revision 259017)
+++ gcc/c/c-typeck.c	(working copy)
@@ -10129,13 +10129,13 @@  c_finish_return (location_t loc, tree retval, tree
   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
@@ -10153,7 +10153,7 @@  c_finish_return (location_t loc, tree retval, tree
       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: gcc/c-family/c-opts.c
===================================================================
--- gcc/c-family/c-opts.c	(revision 259017)
+++ gcc/c-family/c-opts.c	(working copy)
@@ -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: gcc/testsuite/gcc.dg/noncompile/pr55976-1.c
===================================================================
--- gcc/testsuite/gcc.dg/noncompile/pr55976-1.c	(revision 0)
+++ gcc/testsuite/gcc.dg/noncompile/pr55976-1.c	(working copy)
@@ -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;
+}
Index: gcc/testsuite/gcc.dg/noncompile/pr55976-2.c
===================================================================
--- gcc/testsuite/gcc.dg/noncompile/pr55976-2.c	(revision 0)
+++ gcc/testsuite/gcc.dg/noncompile/pr55976-2.c	(working copy)
@@ -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;
+}
+