aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2002-01-04 22:03:20 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2002-01-04 22:03:20 +0100
commitb0832fe1f38ce3553cb4d3b91b4821565c9d0d36 (patch)
tree39b333f5be357db96e4a98270b060aeefbef3de7
parent81550d0e5fea4bf706390c9cd84b14d6f8d8fe3e (diff)
downloadgcc-b0832fe1f38ce3553cb4d3b91b4821565c9d0d36.zip
gcc-b0832fe1f38ce3553cb4d3b91b4821565c9d0d36.tar.gz
gcc-b0832fe1f38ce3553cb4d3b91b4821565c9d0d36.tar.bz2
tree.h (expand_expr_stmt_value): Add maybe_last argument.
* tree.h (expand_expr_stmt_value): Add maybe_last argument. * c-common.h (genrtl_expr_stmt_value): Likewise. * stmt.c (expand_expr_stmt): Pass 1 as maybe_last. (expand_expr_stmt_value): Add maybe_last argument. Don't warn about statement with no effect if it is the last statement in expression statement. * c-semantics.c (genrtl_expr_stmt): Pass 1 as maybe_last. (genrtl_expr_stmt_value): Add maybe_last argument, pass it down to expand_expr_stmt_value. (expand_stmt) [EXPR_STMT]: Pass 1 as maybe_last to genrtl_expr_stmt_value if t is the last EXPR_STMT in its scope. * expr.c (expand_expr) [LABELED_BLOCK_EXPR, LOOP_EXPR]: Pass 1 as maybe_last to expand_expr_stmt_value. * gcc.dg/20020104-1.c: New test. From-SVN: r48541
-rw-r--r--gcc/ChangeLog16
-rw-r--r--gcc/c-common.h2
-rw-r--r--gcc/c-semantics.c17
-rw-r--r--gcc/expr.c4
-rw-r--r--gcc/stmt.c12
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.dg/20020104-1.c22
-rw-r--r--gcc/tree.h2
8 files changed, 64 insertions, 15 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 765c1db..ad2c5ef 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,19 @@
+2002-01-04 Jakub Jelinek <jakub@redhat.com>
+
+ * tree.h (expand_expr_stmt_value): Add maybe_last argument.
+ * c-common.h (genrtl_expr_stmt_value): Likewise.
+ * stmt.c (expand_expr_stmt): Pass 1 as maybe_last.
+ (expand_expr_stmt_value): Add maybe_last argument.
+ Don't warn about statement with no effect if it is the last statement
+ in expression statement.
+ * c-semantics.c (genrtl_expr_stmt): Pass 1 as maybe_last.
+ (genrtl_expr_stmt_value): Add maybe_last argument, pass it down to
+ expand_expr_stmt_value.
+ (expand_stmt) [EXPR_STMT]: Pass 1 as maybe_last to
+ genrtl_expr_stmt_value if t is the last EXPR_STMT in its scope.
+ * expr.c (expand_expr) [LABELED_BLOCK_EXPR, LOOP_EXPR]: Pass 1
+ as maybe_last to expand_expr_stmt_value.
+
Fri Jan 4 11:45:05 2002 Jeffrey A Law (law@redhat.com)
* c-common.c (c_expand_start_cond): Expect the IF_STMT node to
diff --git a/gcc/c-common.h b/gcc/c-common.h
index 296c9af..873021b 100644
--- a/gcc/c-common.h
+++ b/gcc/c-common.h
@@ -721,7 +721,7 @@ extern void add_c_tree_codes PARAMS ((void));
extern void genrtl_do_pushlevel PARAMS ((void));
extern void genrtl_goto_stmt PARAMS ((tree));
extern void genrtl_expr_stmt PARAMS ((tree));
-extern void genrtl_expr_stmt_value PARAMS ((tree, int));
+extern void genrtl_expr_stmt_value PARAMS ((tree, int, int));
extern void genrtl_decl_stmt PARAMS ((tree));
extern void genrtl_if_stmt PARAMS ((tree));
extern void genrtl_while_stmt PARAMS ((tree));
diff --git a/gcc/c-semantics.c b/gcc/c-semantics.c
index ef9ba33..4bab4d3 100644
--- a/gcc/c-semantics.c
+++ b/gcc/c-semantics.c
@@ -313,18 +313,20 @@ void
genrtl_expr_stmt (expr)
tree expr;
{
- genrtl_expr_stmt_value (expr, -1);
+ genrtl_expr_stmt_value (expr, -1, 1);
}
/* Generate the RTL for EXPR, which is an EXPR_STMT. WANT_VALUE tells
whether to (1) save the value of the expression, (0) discard it or
(-1) use expr_stmts_for_value to tell. The use of -1 is
- deprecated, and retained only for backward compatibility. */
+ deprecated, and retained only for backward compatibility.
+ MAYBE_LAST is non-zero if this EXPR_STMT might be the last statement
+ in expression statement. */
void
-genrtl_expr_stmt_value (expr, want_value)
+genrtl_expr_stmt_value (expr, want_value, maybe_last)
tree expr;
- int want_value;
+ int want_value, maybe_last;
{
if (expr != NULL_TREE)
{
@@ -334,7 +336,7 @@ genrtl_expr_stmt_value (expr, want_value)
expand_start_target_temps ();
if (expr != error_mark_node)
- expand_expr_stmt_value (expr, want_value);
+ expand_expr_stmt_value (expr, want_value, maybe_last);
if (stmts_are_full_exprs_p ())
expand_end_target_temps ();
@@ -763,7 +765,10 @@ expand_stmt (t)
break;
case EXPR_STMT:
- genrtl_expr_stmt_value (EXPR_STMT_EXPR (t), TREE_ADDRESSABLE (t));
+ genrtl_expr_stmt_value (EXPR_STMT_EXPR (t), TREE_ADDRESSABLE (t),
+ TREE_CHAIN (t) == NULL
+ || (TREE_CODE (TREE_CHAIN (t)) == SCOPE_STMT
+ && TREE_CHAIN (TREE_CHAIN (t)) == NULL));
break;
case DECL_STMT:
diff --git a/gcc/expr.c b/gcc/expr.c
index b07d88d..04d801d 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -6453,7 +6453,7 @@ expand_expr (exp, target, tmode, modifier)
case LABELED_BLOCK_EXPR:
if (LABELED_BLOCK_BODY (exp))
- expand_expr_stmt_value (LABELED_BLOCK_BODY (exp), 0);
+ expand_expr_stmt_value (LABELED_BLOCK_BODY (exp), 0, 1);
/* Should perhaps use expand_label, but this is simpler and safer. */
do_pending_stack_adjust ();
emit_label (label_rtx (LABELED_BLOCK_LABEL (exp)));
@@ -6468,7 +6468,7 @@ expand_expr (exp, target, tmode, modifier)
case LOOP_EXPR:
push_temp_slots ();
expand_start_loop (1);
- expand_expr_stmt_value (TREE_OPERAND (exp, 0), 0);
+ expand_expr_stmt_value (TREE_OPERAND (exp, 0), 0, 1);
expand_end_loop ();
pop_temp_slots ();
diff --git a/gcc/stmt.c b/gcc/stmt.c
index 16a3882..6933599 100644
--- a/gcc/stmt.c
+++ b/gcc/stmt.c
@@ -2190,7 +2190,7 @@ void
expand_expr_stmt (exp)
tree exp;
{
- expand_expr_stmt_value (exp, -1);
+ expand_expr_stmt_value (exp, -1, 1);
}
/* Generate RTL to evaluate the expression EXP. WANT_VALUE tells
@@ -2199,9 +2199,9 @@ expand_expr_stmt (exp)
deprecated, and retained only for backward compatibility. */
void
-expand_expr_stmt_value (exp, want_value)
+expand_expr_stmt_value (exp, want_value, maybe_last)
tree exp;
- int want_value;
+ int want_value, maybe_last;
{
rtx value;
tree type;
@@ -2211,8 +2211,10 @@ expand_expr_stmt_value (exp, want_value)
/* If -W, warn about statements with no side effects,
except for an explicit cast to void (e.g. for assert()), and
- except inside a ({...}) where they may be useful. */
- if (! want_value && exp != error_mark_node)
+ except for last statement in ({...}) where they may be useful. */
+ if (! want_value
+ && (expr_stmts_for_value == 0 || ! maybe_last)
+ && exp != error_mark_node)
{
if (! TREE_SIDE_EFFECTS (exp))
{
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index ec0bdab..657035c 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2002-01-04 Jakub Jelinek <jakub@redhat.com>
+
+ * gcc.dg/20020104-1.c: New test.
+
2002-01-04 Hans-Peter Nilsson <hp@bitrange.com>
* gcc.dg/20020103-1.c: Fix typo in target selector.
diff --git a/gcc/testsuite/gcc.dg/20020104-1.c b/gcc/testsuite/gcc.dg/20020104-1.c
new file mode 100644
index 0000000..be36a74
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/20020104-1.c
@@ -0,0 +1,22 @@
+/* Test whether statement with no effect warnings are not given for last
+ statements inside of statement expression. */
+/* { dg-do compile } */
+/* { dg-options "-O -Wall" } */
+
+void bar (char *p, char *q);
+
+int main()
+{
+ char foo [32], *p;
+
+ ({
+ void *s = (foo);
+ __builtin_memset (s, '\0', sizeof (foo));
+ s; /* { dg-warning "no effect" "statement with no effect warning" } */
+ s; /* { dg-bogus "no effect" "bogus statement with no effect warning" } */
+ });
+ p = foo;
+ p; /* { dg-warning "no effect" "statement with no effect warning" } */
+ bar (foo, p);
+ return 0;
+}
diff --git a/gcc/tree.h b/gcc/tree.h
index 208e6d0..642b555 100644
--- a/gcc/tree.h
+++ b/gcc/tree.h
@@ -2720,7 +2720,7 @@ extern void expand_fixups PARAMS ((rtx));
extern tree expand_start_stmt_expr PARAMS ((void));
extern tree expand_end_stmt_expr PARAMS ((tree));
extern void expand_expr_stmt PARAMS ((tree));
-extern void expand_expr_stmt_value PARAMS ((tree, int));
+extern void expand_expr_stmt_value PARAMS ((tree, int, int));
extern int warn_if_unused_value PARAMS ((tree));
extern void expand_decl_init PARAMS ((tree));
extern void clear_last_expr PARAMS ((void));