]> gcc.gnu.org Git - gcc.git/commitdiff
re PR c/23075 (Redundant / bogus warning)
authorJakub Jelinek <jakub@redhat.com>
Tue, 6 Sep 2005 20:07:13 +0000 (22:07 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 6 Sep 2005 20:07:13 +0000 (22:07 +0200)
PR c/23075
* c-typeck.c (c_finish_return): Set TREE_NO_WARNING on RETURN_EXPR
if "return with no value, in function returning non-void" warning
has been issued.
   * tree-cfg.c (execute_warn_function_return): Don't look at
RETURN_EXPRs with TREE_NO_WARNING set.

* typeck.c (check_return_expr): Add no_warning argument.  Set
*no_warning to true if "return-statement with no value, in function
returning" warning has been issued.
* cp-tree.h (check_return_expr): Adjust prototype.
* semantics.c (finish_return_stmt): Set TREE_NO_WARNING if
check_return_expr set *no_warning to true.

* gcc.dg/pr23075.c: New test.
* g++.dg/warn/pr23075.C: New test.

From-SVN: r103967

gcc/ChangeLog
gcc/c-typeck.c
gcc/cp/ChangeLog
gcc/cp/cp-tree.h
gcc/cp/semantics.c
gcc/cp/typeck.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/warn/pr23075.C [new file with mode: 0644]
gcc/testsuite/gcc.dg/pr23075.c [new file with mode: 0644]
gcc/tree-cfg.c

index 9c603172c66084904d07f2b5d0adb2f068fb377e..7ed2b69d02395aad7a59b68a167acb33830481f9 100644 (file)
@@ -1,5 +1,12 @@
 2005-09-06  Jakub Jelinek  <jakub@redhat.com>
 
+       PR c/23075
+       * c-typeck.c (c_finish_return): Set TREE_NO_WARNING on RETURN_EXPR
+       if "return with no value, in function returning non-void" warning
+       has been issued.
+       * tree-cfg.c (execute_warn_function_return): Don't look at
+       RETURN_EXPRs with TREE_NO_WARNING set.
+
        PR target/22362
        * config/i386/i386.c (ix86_function_regparm): Make sure automatic regparm
        for internal functions doesn't use registers used by global registers
index c72ba8aceaa270a70aac9378c3dee039e25ccd70..ff8577be99cee20c26f25a379ee227c90f3e00b5 100644 (file)
@@ -6702,7 +6702,8 @@ c_finish_goto_ptr (tree expr)
 tree
 c_finish_return (tree retval)
 {
-  tree valtype = TREE_TYPE (TREE_TYPE (current_function_decl));
+  tree valtype = TREE_TYPE (TREE_TYPE (current_function_decl)), ret_stmt;
+  bool no_warning = false;
 
   if (TREE_THIS_VOLATILE (current_function_decl))
     warning (0, "function declared %<noreturn%> has a %<return%> statement");
@@ -6712,8 +6713,11 @@ c_finish_return (tree retval)
       current_function_returns_null = 1;
       if ((warn_return_type || flag_isoc99)
          && valtype != 0 && TREE_CODE (valtype) != VOID_TYPE)
-       pedwarn_c99 ("%<return%> with no value, in "
-                    "function returning non-void");
+       {
+         pedwarn_c99 ("%<return%> with no value, in "
+                      "function returning non-void");
+         no_warning = true;
+       }
     }
   else if (valtype == 0 || TREE_CODE (valtype) == VOID_TYPE)
     {
@@ -6789,7 +6793,9 @@ c_finish_return (tree retval)
       retval = build2 (MODIFY_EXPR, TREE_TYPE (res), res, t);
     }
 
-  return add_stmt (build_stmt (RETURN_EXPR, retval));
+  ret_stmt = build_stmt (RETURN_EXPR, retval);
+  TREE_NO_WARNING (ret_stmt) |= no_warning;
+  return add_stmt (ret_stmt);
 }
 \f
 struct c_switch {
index 50ce226f8342f14f8e72079232e3fcf89c917bdc..f56a714b5063e74ac4741572b63c1921af5fbf40 100644 (file)
@@ -1,3 +1,13 @@
+2005-09-06  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c/23075
+       * typeck.c (check_return_expr): Add no_warning argument.  Set
+       *no_warning to true if "return-statement with no value, in function
+       returning" warning has been issued.
+       * cp-tree.h (check_return_expr): Adjust prototype.
+       * semantics.c (finish_return_stmt): Set TREE_NO_WARNING if
+       check_return_expr set *no_warning to true.
+
 2005-09-06  Mark Mitchell  <mark@codesourcery.com>
 
        * cp-tree.h (rvalue): New function.
index 2803f51da271ad1c842a9c48a34a4762bb135fb8..cf241290ca4455d2349c68ec709b6eb870b8e767 100644 (file)
@@ -4322,7 +4322,7 @@ extern tree type_after_usual_arithmetic_conversions (tree, tree);
 extern tree composite_pointer_type             (tree, tree, tree, tree,
                                                 const char*);
 extern tree merge_types                                (tree, tree);
-extern tree check_return_expr                  (tree);
+extern tree check_return_expr                  (tree, bool *);
 #define cp_build_binary_op(code, arg1, arg2) \
   build_binary_op(code, arg1, arg2, 1)
 #define cxx_sizeof(T)  cxx_sizeof_or_alignof_type (T, SIZEOF_EXPR, true)
index 074a7fdf081bd8e0a95c7adb27b474c6f50d5148..c7fd1bbf92914a3a21576be4623b70f7260740a7 100644 (file)
@@ -743,8 +743,9 @@ tree
 finish_return_stmt (tree expr)
 {
   tree r;
+  bool no_warning;
 
-  expr = check_return_expr (expr);
+  expr = check_return_expr (expr, &no_warning);
   if (!processing_template_decl)
     {
       if (DECL_DESTRUCTOR_P (current_function_decl)
@@ -760,6 +761,7 @@ finish_return_stmt (tree expr)
     }
 
   r = build_stmt (RETURN_EXPR, expr);
+  TREE_NO_WARNING (r) |= no_warning;
   r = maybe_cleanup_point_expr_void (r);
   r = add_stmt (r);
   finish_stmt ();
index 67f631a31e51021cd6f6deb1b2835c1aa8750c30..b0dfa604d89dcb263a701420dfd5e19e308be8c3 100644 (file)
@@ -6134,10 +6134,12 @@ maybe_warn_about_returning_address_of_local (tree retval)
 /* Check that returning RETVAL from the current function is valid.
    Return an expression explicitly showing all conversions required to
    change RETVAL into the function return type, and to assign it to
-   the DECL_RESULT for the function.  */
+   the DECL_RESULT for the function.  Set *NO_WARNING to true if
+   code reaches end of non-void function warning shouldn't be issued
+   on this RETURN_EXPR.  */
 
 tree
-check_return_expr (tree retval)
+check_return_expr (tree retval, bool *no_warning)
 {
   tree result;
   /* The type actually returned by the function, after any
@@ -6145,6 +6147,8 @@ check_return_expr (tree retval)
   tree valtype;
   int fn_returns_value_p;
 
+  *no_warning = false;
+
   /* A `volatile' function is one that isn't supposed to return, ever.
      (This is a G++ extension, used to get better code for functions
      that call the `volatile' function.)  */
@@ -6195,6 +6199,10 @@ check_return_expr (tree retval)
         end of a non-void function (which we don't, we gave a
         return!).  */
       current_function_returns_null = 0;
+      /* And signal caller that TREE_NO_WARNING should be set on the
+         RETURN_EXPR to avoid control reaches end of non-void function
+         warnings in tree-cfg.c.  */
+      *no_warning = true;
     }
   /* Check for a return statement with a value in a function that
      isn't supposed to return a value.  */
index b76b34bd00944a0e3d7be91c3d53ffe117bc1987..74e070baef2308813732dc9049c2508efb5018ae 100644 (file)
@@ -1,5 +1,9 @@
 2005-09-06  Jakub Jelinek  <jakub@redhat.com>
 
+       PR c/23075
+       * gcc.dg/pr23075.c: New test.
+       * g++.dg/warn/pr23075.C: New test.
+
        PR target/22362
        * gcc.target/i386/pr22362.c: New test.
 
diff --git a/gcc/testsuite/g++.dg/warn/pr23075.C b/gcc/testsuite/g++.dg/warn/pr23075.C
new file mode 100644 (file)
index 0000000..cc71dea
--- /dev/null
@@ -0,0 +1,14 @@
+// PR c/23075
+// { dg-do compile }
+// { dg-options "-O2 -Wreturn-type" }
+
+int
+foo (void)
+{
+  return;      // { dg-error "with no value" }
+}              // { dg-bogus "control reaches end" }
+
+int
+bar (void)
+{
+}              // { dg-warning "control reaches end" }
diff --git a/gcc/testsuite/gcc.dg/pr23075.c b/gcc/testsuite/gcc.dg/pr23075.c
new file mode 100644 (file)
index 0000000..2d85fb0
--- /dev/null
@@ -0,0 +1,14 @@
+/* PR c/23075 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -Wreturn-type" } */
+
+int
+foo (void)
+{
+  return;      /* { dg-warning "with no value" } */
+}              /* { dg-bogus "control reaches end" } */
+
+int
+bar (void)
+{
+}              /* { dg-warning "control reaches end" } */
index df97058afe2d3efd905d79373d01775cf571a04a..371155629747b67e939890be638bae542f8baeb2 100644 (file)
@@ -5125,7 +5125,8 @@ execute_warn_function_return (void)
        {
          tree last = last_stmt (e->src);
          if (TREE_CODE (last) == RETURN_EXPR
-             && TREE_OPERAND (last, 0) == NULL)
+             && TREE_OPERAND (last, 0) == NULL
+             && !TREE_NO_WARNING (last))
            {
 #ifdef USE_MAPPED_LOCATION
              location = EXPR_LOCATION (last);
This page took 0.10276 seconds and 5 git commands to generate.