re PR c/67730 (No warning when returning NULL in void function)
authorMarek Polacek <polacek@redhat.com>
Wed, 30 Sep 2015 11:26:44 +0000 (11:26 +0000)
committerMarek Polacek <mpolacek@gcc.gnu.org>
Wed, 30 Sep 2015 11:26:44 +0000 (11:26 +0000)
PR c/67730
* c-typeck.c (c_finish_return): Use the expansion point location for
certain "return with value" warnings.

* gcc.dg/pr67730.c: New test.

From-SVN: r228286

gcc/c/ChangeLog
gcc/c/c-typeck.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr67730.c [new file with mode: 0644]

index aa6d715288d84d041dd9d6d47403462eceeeb6f3..10ed324c9f5b23723eb4ec7400acaba61c4f2cf9 100644 (file)
@@ -1,3 +1,9 @@
+2015-09-30  Marek Polacek  <polacek@redhat.com>
+
+       PR c/67730
+       * c-typeck.c (c_finish_return): Use the expansion point location for
+       certain "return with value" warnings.
+
 2015-09-18  Manuel López-Ibáñez  <manu@gcc.gnu.org>
 
        * c-parser.c (pragma_lex): Add loc argument.
index 3b2623140e3d2118452672abcdbafc2533bb18e0..a11ccb20b334ab7dd8c2a34727195044ad70257b 100644 (file)
@@ -9369,8 +9369,12 @@ c_finish_return (location_t loc, tree retval, tree origtype)
   bool npc = false;
   size_t rank = 0;
 
+  /* Use the expansion point to handle cases such as returning NULL
+     in a function returning void.  */
+  source_location xloc = expansion_point_location_if_in_system_header (loc);
+
   if (TREE_THIS_VOLATILE (current_function_decl))
-    warning_at (loc, 0,
+    warning_at (xloc, 0,
                "function declared %<noreturn%> has a %<return%> statement");
 
   if (flag_cilkplus && contains_array_notation_expr (retval))
@@ -9425,10 +9429,10 @@ c_finish_return (location_t loc, tree retval, tree origtype)
     {
       current_function_returns_null = 1;
       if (TREE_CODE (TREE_TYPE (retval)) != VOID_TYPE)
-       pedwarn (loc, 0,
+       pedwarn (xloc, 0,
                 "%<return%> with a value, in function returning void");
       else
-       pedwarn (loc, OPT_Wpedantic, "ISO C forbids "
+       pedwarn (xloc, OPT_Wpedantic, "ISO C forbids "
                 "%<return%> with expression, in function returning void");
     }
   else
index 36a41d6c129cae9ab4a09e4bcee57fbd6bd7d79c..8192f18808388b8b9d4b74b7a77d30d6a2314aeb 100644 (file)
@@ -1,3 +1,8 @@
+2015-09-30  Marek Polacek  <polacek@redhat.com>
+
+       PR c/67730
+       * gcc.dg/pr67730.c: New test.
+
 2015-09-30  Marek Polacek  <polacek@redhat.com>
 
        PR tree-optimization/67690
diff --git a/gcc/testsuite/gcc.dg/pr67730.c b/gcc/testsuite/gcc.dg/pr67730.c
new file mode 100644 (file)
index 0000000..54d73a6
--- /dev/null
@@ -0,0 +1,11 @@
+/* PR c/67730 */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+#include <stddef.h>
+
+void
+fn1 (void)
+{
+  return NULL; /* { dg-warning "10:.return. with a value" } */
+}