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:
parent
edf86ec148
commit
056928b248
@ -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.
|
||||
|
@ -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);
|
||||
|
@ -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. */
|
||||
|
@ -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
|
||||
|
16
gcc/cp/cvt.c
16
gcc/cp/cvt.c
@ -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))
|
||||
|
@ -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))
|
||||
|
@ -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
|
||||
|
48
gcc/testsuite/c-c++-common/Wunused-var-7.c
Normal file
48
gcc/testsuite/c-c++-common/Wunused-var-7.c
Normal 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" } */
|
||||
}
|
13
gcc/testsuite/g++.dg/warn/Wunused-var-9.C
Normal file
13
gcc/testsuite/g++.dg/warn/Wunused-var-9.C
Normal 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);
|
||||
}
|
Loading…
Reference in New Issue
Block a user