aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>2004-06-20 17:16:27 +0000
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>2004-06-20 17:16:27 +0000
commitc48505a3917ae3d1159bb40effa6aecd3cd4fc1d (patch)
treeed8b5243c2eb8d695f4aecb713b9176aeb3cafe3
parenta0fee14aa7831636bf6b6fc6d5fb852979c80ab4 (diff)
* 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@83416 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/c-gimplify.c7
-rw-r--r--gcc/c-typeck.c2
-rw-r--r--gcc/stmt.c32
-rw-r--r--gcc/tree.h2
5 files changed, 32 insertions, 18 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 744f3967782..8d02e2b387c 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/c-gimplify.c b/gcc/c-gimplify.c
index 57208e4c03f..9259923794f 100644
--- a/gcc/c-gimplify.c
+++ b/gcc/c-gimplify.c
@@ -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)
diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c
index 201c5f1c114..99bb78d7c1d 100644
--- a/gcc/c-typeck.c
+++ b/gcc/c-typeck.c
@@ -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);
}
diff --git a/gcc/stmt.c b/gcc/stmt.c
index aa970dfd2fb..4d878e3b081 100644
--- a/gcc/stmt.c
+++ b/gcc/stmt.c
@@ -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;
}
}
diff --git a/gcc/tree.h b/gcc/tree.h
index 6babb197c59..d5d87b69d65 100644
--- a/gcc/tree.h
+++ b/gcc/tree.h
@@ -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);