stmt.c (warn_if_unused_value): Add locus argument.
authorRichard Henderson <rth@redhat.com>
Sun, 20 Jun 2004 17:16:27 +0000 (10:16 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Sun, 20 Jun 2004 17:16:27 +0000 (10:16 -0700)
        * stmt.c (warn_if_unused_value): Add locus argument.
        * tree.h (warn_if_unused_value): Update decl.
        * c-typeck.c (internal_build_compound_expr): Update call.
        * c-gimplify.c (gimplify_expr_stmt): Likewise.

From-SVN: r83416

gcc/ChangeLog
gcc/c-gimplify.c
gcc/c-typeck.c
gcc/stmt.c
gcc/tree.h

index 744f3967782d58a7bf8a370fb9d9b1e0cbc6449e..8d02e2b387c007057c747a8cf6ec203b71e405f7 100644 (file)
@@ -1,3 +1,10 @@
+2004-06-20  Richard Henderson  <rth@redhat.com>
+
+       * stmt.c (warn_if_unused_value): Add locus argument.
+       * tree.h (warn_if_unused_value): Update decl.
+       * c-typeck.c (internal_build_compound_expr): Update call.
+       * c-gimplify.c (gimplify_expr_stmt): Likewise.
+
 2004-06-20  Andrew Pinski  <pinskia@physics.uc.edu>
 
        PR middle-end/16089
index 57208e4c03f27b6ceda5c716aa3fa60cb18c9ff3..9259923794f0c2fa545f1399af250591bbd01ec7 100644 (file)
@@ -239,12 +239,7 @@ gimplify_expr_stmt (tree *stmt_p)
            warning ("statement with no effect");
        }
       else if (warn_unused_value)
-       {
-         /* Kludge for 20020220-2.c.  warn_if_unused_value shouldn't use
-            the stmt file location info.  */
-         set_file_and_line_for_stmt (input_location);
-         warn_if_unused_value (stmt);
-       }
+       warn_if_unused_value (stmt, input_location);
     }
 
   if (stmt == NULL_TREE)
index 201c5f1c1142ebfa429491e75046946e49ea144d..99bb78d7c1d75fb8fbe07f203d6483f78db16209 100644 (file)
@@ -2949,7 +2949,7 @@ internal_build_compound_expr (tree list, int first_p)
      `foo() + bar(), baz()' the result of the `+' operator is not used,
      so we should issue a warning.  */
   else if (warn_unused_value)
-    warn_if_unused_value (TREE_VALUE (list));
+    warn_if_unused_value (TREE_VALUE (list), input_location);
 
   return build (COMPOUND_EXPR, TREE_TYPE (rest), TREE_VALUE (list), rest);
 }
index aa970dfd2fb09f121ab8fe6b5b5f74b3316c3ba5..4d878e3b081385acf08870e31000f56f727e045b 100644 (file)
@@ -2097,7 +2097,7 @@ expand_expr_stmt_value (tree exp, int want_value, int maybe_last)
       && warn_unused_value)
     {
       if (TREE_SIDE_EFFECTS (exp))
-       warn_if_unused_value (exp);
+       warn_if_unused_value (exp, emit_locus);
       else if (!VOID_TYPE_P (TREE_TYPE (exp)) && !TREE_NO_WARNING (exp))
        warning ("%Hstatement with no effect", &emit_locus);
     }
@@ -2155,11 +2155,13 @@ expand_expr_stmt_value (tree exp, int want_value, int maybe_last)
 }
 
 /* Warn if EXP contains any computations whose results are not used.
-   Return 1 if a warning is printed; 0 otherwise.  */
+   Return 1 if a warning is printed; 0 otherwise.  LOCUS is the 
+   (potential) location of the expression.  */
 
 int
-warn_if_unused_value (tree exp)
+warn_if_unused_value (tree exp, location_t locus)
 {
+ restart:
   if (TREE_USED (exp))
     return 0;
 
@@ -2169,6 +2171,9 @@ warn_if_unused_value (tree exp)
   if (VOID_TYPE_P (TREE_TYPE (exp)))
     return 0;
 
+  if (EXPR_LOCUS (exp))
+    locus = *EXPR_LOCUS (exp);
+
   switch (TREE_CODE (exp))
     {
     case PREINCREMENT_EXPR:
@@ -2187,25 +2192,29 @@ warn_if_unused_value (tree exp)
 
     case BIND_EXPR:
       /* For a binding, warn if no side effect within it.  */
-      return warn_if_unused_value (TREE_OPERAND (exp, 1));
+      exp = BIND_EXPR_BODY (exp);
+      goto restart;
 
     case SAVE_EXPR:
-      return warn_if_unused_value (TREE_OPERAND (exp, 0));
+      exp = TREE_OPERAND (exp, 0);
+      goto restart;
 
     case TRUTH_ORIF_EXPR:
     case TRUTH_ANDIF_EXPR:
       /* In && or ||, warn if 2nd operand has no side effect.  */
-      return warn_if_unused_value (TREE_OPERAND (exp, 1));
+      exp = TREE_OPERAND (exp, 1);
+      goto restart;
 
     case COMPOUND_EXPR:
       if (TREE_NO_WARNING (exp))
        return 0;
-      if (warn_if_unused_value (TREE_OPERAND (exp, 0)))
+      if (warn_if_unused_value (TREE_OPERAND (exp, 0), locus))
        return 1;
       /* Let people do `(foo (), 0)' without a warning.  */
       if (TREE_CONSTANT (TREE_OPERAND (exp, 1)))
        return 0;
-      return warn_if_unused_value (TREE_OPERAND (exp, 1));
+      exp = TREE_OPERAND (exp, 1);
+      goto restart;
 
     case NOP_EXPR:
     case CONVERT_EXPR:
@@ -2233,7 +2242,10 @@ warn_if_unused_value (tree exp)
       /* Don't warn about automatic dereferencing of references, since
         the user cannot control it.  */
       if (TREE_CODE (TREE_TYPE (TREE_OPERAND (exp, 0))) == REFERENCE_TYPE)
-       return warn_if_unused_value (TREE_OPERAND (exp, 0));
+       {
+         exp = TREE_OPERAND (exp, 0);
+         goto restart;
+       }
       /* Fall through.  */
 
     default:
@@ -2255,7 +2267,7 @@ warn_if_unused_value (tree exp)
       if (TREE_SIDE_EFFECTS (exp))
        return 0;
 
-      warning ("%Hvalue computed is not used", &emit_locus);
+      warning ("%Hvalue computed is not used", &locus);
       return 1;
     }
 }
index 6babb197c59ccaf8e2d2994a4fdc99070c18a8d8..d5d87b69d655959a9a653d64822f9394e483aa53 100644 (file)
@@ -3240,7 +3240,7 @@ extern tree expand_start_stmt_expr (int);
 extern tree expand_end_stmt_expr (tree);
 extern void expand_expr_stmt (tree);
 extern void expand_expr_stmt_value (tree, int, int);
-extern int warn_if_unused_value (tree);
+extern int warn_if_unused_value (tree, location_t);
 extern void expand_decl_init (tree);
 extern void clear_last_expr (void);
 extern void expand_label (tree);