The following improves the location for "statement with no effect" warning by using the location of the expression if available. Can't use EXPR_LOCATION as *_DECLs still don't carry a location.
Bootstrapped/regtested on x86_64-linux, ok for trunk? 2015-12-16 Marek Polacek <pola...@redhat.com> PR c/64637 * c-typeck.c (c_process_expr_stmt): Use location of the expression if available. * gcc.dg/pr64637.c: New test. diff --git gcc/c/c-typeck.c gcc/c/c-typeck.c index 9d6c604..a147ac6 100644 --- gcc/c/c-typeck.c +++ gcc/c/c-typeck.c @@ -10131,7 +10131,7 @@ c_process_expr_stmt (location_t loc, tree expr) out which is the result. */ if (!STATEMENT_LIST_STMT_EXPR (cur_stmt_list) && warn_unused_value) - emit_side_effect_warnings (loc, expr); + emit_side_effect_warnings (EXPR_LOC_OR_LOC (expr, loc), expr); exprv = expr; while (TREE_CODE (exprv) == COMPOUND_EXPR) diff --git gcc/testsuite/gcc.dg/pr64637.c gcc/testsuite/gcc.dg/pr64637.c index e69de29..779ff50 100644 --- gcc/testsuite/gcc.dg/pr64637.c +++ gcc/testsuite/gcc.dg/pr64637.c @@ -0,0 +1,25 @@ +/* PR c/64637 */ +/* { dg-do compile } */ +/* { dg-options "-Wunused" } */ + +void g (); + +void +f (int b) +{ + for (int i = 0; i < b; i + b) /* { dg-warning "28:statement with no effect" } */ + g (); + // PARM_DECLs still don't have a location, don't expect an exact location. + for (int i = 0; i < b; b) /* { dg-warning "statement with no effect" } */ + g (); + for (int i = 0; i < b; !i) /* { dg-warning "26:statement with no effect" } */ + g (); + for (!b;;) /* { dg-warning "8:statement with no effect" } */ + g (); + for (;; b * 2) /* { dg-warning "13:statement with no effect" } */ + g (); + ({ + b / 5; /* { dg-warning "8:statement with no effect" } */ + b ^ 5; + }); +} Marek