On Wed, 2015-12-16 at 15:58 +0100, Marek Polacek wrote: > 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.
Out of interest, does it emit sane underlined ranges for these cases, with the patch? > 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