This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Fix warn_if_unused_value line numbering
- From: Richard Henderson <rth at twiddle dot net>
- To: gcc-patches at gcc dot gnu dot org
- Date: Sun, 20 Jun 2004 10:18:08 -0700
- Subject: Fix warn_if_unused_value line numbering
Moves away from using the emit_locus rtl state.
r~
* 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.
Index: c-gimplify.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/c-gimplify.c,v
retrieving revision 2.13
diff -u -p -u -r2.13 c-gimplify.c
--- c-gimplify.c 20 Jun 2004 10:09:56 -0000 2.13
+++ c-gimplify.c 20 Jun 2004 17:07:33 -0000
@@ -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: c-typeck.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/c-typeck.c,v
retrieving revision 1.321
diff -u -p -u -r1.321 c-typeck.c
--- c-typeck.c 20 Jun 2004 09:18:04 -0000 1.321
+++ c-typeck.c 20 Jun 2004 17:07:34 -0000
@@ -2949,7 +2949,7 @@ internal_build_compound_expr (tree list,
`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: stmt.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/stmt.c,v
retrieving revision 1.360
diff -u -p -u -r1.360 stmt.c
--- stmt.c 19 Jun 2004 18:52:04 -0000 1.360
+++ stmt.c 20 Jun 2004 17:07:35 -0000
@@ -2097,7 +2097,7 @@ expand_expr_stmt_value (tree exp, int wa
&& 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 wa
}
/* 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: tree.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree.h,v
retrieving revision 1.523
diff -u -p -u -r1.523 tree.h
--- tree.h 20 Jun 2004 09:18:05 -0000 1.523
+++ tree.h 20 Jun 2004 17:07:35 -0000
@@ -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);