re PR c++/44062 ((void)var; doesn't prevent 'set but not used' warning)

PR c++/44062
	* c-parser.c (c_parser_expression): Mark LHS of a comma
	expression as read if it is a decl, handled component or
	COMPOUND_EXPR with that on the RHS.
	* c-typeck.c (c_process_expr_stmt): Mark RHS of COMPOUND_EXPR
	if it is a decl or handled component.

	* semantics.c (finish_expr_stmt): Don't call mark_exp_read here...
	* cvt.c (convert_to_void): ... but here.  If expr is a COMPOUND_EXPR,
	look at its second operand.

	* c-c++-common/Wunused-var-7.c: New test.
	* g++.dg/warn/Wunused-var-9.C: New test.

From-SVN: r159286
This commit is contained in:
Jakub Jelinek 2010-05-11 20:12:28 +02:00 committed by Jakub Jelinek
parent edf86ec148
commit 056928b248
9 changed files with 112 additions and 11 deletions

View File

@ -1,3 +1,12 @@
2010-05-11 Jakub Jelinek <jakub@redhat.com>
PR c++/44062
* c-parser.c (c_parser_expression): Mark LHS of a comma
expression as read if it is a decl, handled component or
COMPOUND_EXPR with that on the RHS.
* c-typeck.c (c_process_expr_stmt): Mark RHS of COMPOUND_EXPR
if it is a decl or handled component.
2010-05-11 Jan Hubicka <jh@suse.cz>
* lto-symtab.c (lto_symtab_free): New function.

View File

@ -6028,10 +6028,16 @@ c_parser_expression (c_parser *parser)
while (c_parser_next_token_is (parser, CPP_COMMA))
{
struct c_expr next;
tree lhsval;
location_t loc = c_parser_peek_token (parser)->location;
location_t expr_loc;
c_parser_consume_token (parser);
expr_loc = c_parser_peek_token (parser)->location;
lhsval = expr.value;
while (TREE_CODE (lhsval) == COMPOUND_EXPR)
lhsval = TREE_OPERAND (lhsval, 1);
if (DECL_P (lhsval) || handled_component_p (lhsval))
mark_exp_read (lhsval);
next = c_parser_expr_no_commas (parser, NULL);
next = default_function_array_conversion (expr_loc, next);
expr.value = build_compound_expr (loc, expr.value, next.value);

View File

@ -8841,6 +8841,8 @@ emit_side_effect_warnings (location_t loc, tree expr)
tree
c_process_expr_stmt (location_t loc, tree expr)
{
tree exprv;
if (!expr)
return NULL_TREE;
@ -8861,8 +8863,11 @@ c_process_expr_stmt (location_t loc, tree expr)
&& warn_unused_value)
emit_side_effect_warnings (loc, expr);
if (DECL_P (expr) || handled_component_p (expr))
mark_exp_read (expr);
exprv = expr;
while (TREE_CODE (exprv) == COMPOUND_EXPR)
exprv = TREE_OPERAND (exprv, 1);
if (DECL_P (exprv) || handled_component_p (exprv))
mark_exp_read (exprv);
/* If the expression is not of a type to which we cannot assign a line
number, wrap the thing in a no-op NOP_EXPR. */

View File

@ -1,3 +1,10 @@
2010-05-11 Jakub Jelinek <jakub@redhat.com>
PR c++/44062
* semantics.c (finish_expr_stmt): Don't call mark_exp_read here...
* cvt.c (convert_to_void): ... but here. If expr is a COMPOUND_EXPR,
look at its second operand.
2010-05-10 Jason Merrill <jason@redhat.com>
PR c++/44017

View File

@ -1,6 +1,6 @@
/* Language-level data type conversion for GNU C++.
Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
Free Software Foundation, Inc.
Hacked by Michael Tiemann (tiemann@cygnus.com)
@ -822,9 +822,23 @@ ocp_convert (tree type, tree expr, int convtype, int flags)
tree
convert_to_void (tree expr, const char *implicit, tsubst_flags_t complain)
{
tree exprv;
if (expr == error_mark_node
|| TREE_TYPE (expr) == error_mark_node)
return error_mark_node;
exprv = expr;
while (TREE_CODE (exprv) == COMPOUND_EXPR)
exprv = TREE_OPERAND (exprv, 1);
if (DECL_P (exprv) || handled_component_p (exprv))
/* Expr is not being 'used' here, otherwise we whould have
called mark_{rl}value_use use here, which would have in turn
called mark_exp_read. Rather, we call mark_exp_read directly
to avoid some warnings when
-Wunused-but-set-{variable,parameter} is in effect. */
mark_exp_read (exprv);
if (!TREE_TYPE (expr))
return expr;
if (invalid_nonstatic_memfn_p (expr, complain))

View File

@ -4,7 +4,7 @@
and during the instantiation of template functions.
Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
2008, 2009 Free Software Foundation, Inc.
2008, 2009, 2010 Free Software Foundation, Inc.
Written by Mark Mitchell (mmitchell@usa.net) based on code found
formerly in parse.y and pt.c.
@ -610,13 +610,6 @@ finish_expr_stmt (tree expr)
{
if (warn_sequence_point)
verify_sequence_points (expr);
if (TREE_CODE (expr) != MODIFY_EXPR)
/* Expr is not being 'used' here, otherwise we whould have
called mark_{rl}value_use use here, which would have in turn
called mark_exp_read. Rather, we call mark_exp_read directly
to avoid some warnings when
-Wunused-but-set-{variable,parameter} is in effect. */
mark_exp_read (expr);
expr = convert_to_void (expr, "statement", tf_warning_or_error);
}
else if (!type_dependent_expression_p (expr))

View File

@ -1,3 +1,9 @@
2010-05-11 Jakub Jelinek <jakub@redhat.com>
PR c++/44062
* c-c++-common/Wunused-var-7.c: New test.
* g++.dg/warn/Wunused-var-9.C: New test.
2010-05-11 Daniel Franke <franke.daniel@gmail.com>
PR fortran/43711

View File

@ -0,0 +1,48 @@
/* PR c++/44062 */
/* { dg-do compile } */
/* { dg-options "-Wunused" } */
void
foo (void)
{
int a, b, c, d, e, f, g;
a = 1;
b = 2;
c = 3;
d = 4;
e = 5;
f = 6;
g = 7;
a; /* { dg-warning "no effect" } */
b, 1; /* { dg-warning "no effect" } */
(void) c;
(void) d, 1; /* { dg-warning "no effect" } */
e, f, 1; /* { dg-warning "no effect" } */
(void) g, f, 1; /* { dg-warning "no effect" } */
}
void
bar (void)
{
int a;
int b;
int c; /* { dg-warning "set but not used" } */
a = 1;
b = 2;
c = 3;
c = ({ a++, b; });
}
void
baz (void)
{
int a;
int b;
int c;
int d;
a = 1;
b = 2;
c = 3;
d = 4;
d, ( a++, b ), c; /* { dg-warning "no effect" } */
}

View File

@ -0,0 +1,13 @@
/* PR c++/44062 */
/* { dg-do compile } */
/* { dg-options "-Wunused" } */
void
f ()
{
int i = 4;
static_cast <void> (i);
int j;
j = 5;
static_cast <void> (j);
}