Commit 056928b2 by Jakub Jelinek Committed by Jakub Jelinek

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
parent edf86ec1
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> 2010-05-11 Jan Hubicka <jh@suse.cz>
* lto-symtab.c (lto_symtab_free): New function. * lto-symtab.c (lto_symtab_free): New function.
......
...@@ -6028,10 +6028,16 @@ c_parser_expression (c_parser *parser) ...@@ -6028,10 +6028,16 @@ c_parser_expression (c_parser *parser)
while (c_parser_next_token_is (parser, CPP_COMMA)) while (c_parser_next_token_is (parser, CPP_COMMA))
{ {
struct c_expr next; struct c_expr next;
tree lhsval;
location_t loc = c_parser_peek_token (parser)->location; location_t loc = c_parser_peek_token (parser)->location;
location_t expr_loc; location_t expr_loc;
c_parser_consume_token (parser); c_parser_consume_token (parser);
expr_loc = c_parser_peek_token (parser)->location; 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 = c_parser_expr_no_commas (parser, NULL);
next = default_function_array_conversion (expr_loc, next); next = default_function_array_conversion (expr_loc, next);
expr.value = build_compound_expr (loc, expr.value, next.value); expr.value = build_compound_expr (loc, expr.value, next.value);
......
...@@ -8841,6 +8841,8 @@ emit_side_effect_warnings (location_t loc, tree expr) ...@@ -8841,6 +8841,8 @@ emit_side_effect_warnings (location_t loc, tree expr)
tree tree
c_process_expr_stmt (location_t loc, tree expr) c_process_expr_stmt (location_t loc, tree expr)
{ {
tree exprv;
if (!expr) if (!expr)
return NULL_TREE; return NULL_TREE;
...@@ -8861,8 +8863,11 @@ c_process_expr_stmt (location_t loc, tree expr) ...@@ -8861,8 +8863,11 @@ c_process_expr_stmt (location_t loc, tree expr)
&& warn_unused_value) && warn_unused_value)
emit_side_effect_warnings (loc, expr); emit_side_effect_warnings (loc, expr);
if (DECL_P (expr) || handled_component_p (expr)) exprv = expr;
mark_exp_read (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 /* 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. */ number, wrap the thing in a no-op NOP_EXPR. */
......
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> 2010-05-10 Jason Merrill <jason@redhat.com>
PR c++/44017 PR c++/44017
......
/* Language-level data type conversion for GNU C++. /* Language-level data type conversion for GNU C++.
Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 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. Free Software Foundation, Inc.
Hacked by Michael Tiemann (tiemann@cygnus.com) Hacked by Michael Tiemann (tiemann@cygnus.com)
...@@ -822,9 +822,23 @@ ocp_convert (tree type, tree expr, int convtype, int flags) ...@@ -822,9 +822,23 @@ ocp_convert (tree type, tree expr, int convtype, int flags)
tree tree
convert_to_void (tree expr, const char *implicit, tsubst_flags_t complain) convert_to_void (tree expr, const char *implicit, tsubst_flags_t complain)
{ {
tree exprv;
if (expr == error_mark_node if (expr == error_mark_node
|| TREE_TYPE (expr) == error_mark_node) || TREE_TYPE (expr) == error_mark_node)
return 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)) if (!TREE_TYPE (expr))
return expr; return expr;
if (invalid_nonstatic_memfn_p (expr, complain)) if (invalid_nonstatic_memfn_p (expr, complain))
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
and during the instantiation of template functions. and during the instantiation of template functions.
Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 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 Written by Mark Mitchell (mmitchell@usa.net) based on code found
formerly in parse.y and pt.c. formerly in parse.y and pt.c.
...@@ -610,13 +610,6 @@ finish_expr_stmt (tree expr) ...@@ -610,13 +610,6 @@ finish_expr_stmt (tree expr)
{ {
if (warn_sequence_point) if (warn_sequence_point)
verify_sequence_points (expr); 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); expr = convert_to_void (expr, "statement", tf_warning_or_error);
} }
else if (!type_dependent_expression_p (expr)) else if (!type_dependent_expression_p (expr))
......
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> 2010-05-11 Daniel Franke <franke.daniel@gmail.com>
PR fortran/43711 PR fortran/43711
......
/* 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" } */
}
/* 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);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment