re PR c/64637 (Incorrect location for -Wunused-value warnings in for-loop)
authorMarek Polacek <polacek@redhat.com>
Wed, 16 Dec 2015 16:50:07 +0000 (16:50 +0000)
committerMarek Polacek <mpolacek@gcc.gnu.org>
Wed, 16 Dec 2015 16:50:07 +0000 (16:50 +0000)
PR c/64637
* c-typeck.c (c_process_expr_stmt): Use location of the expression if
available.

* gcc.dg/pr64637.c: New test.

From-SVN: r231700

gcc/c/ChangeLog
gcc/c/c-typeck.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr64637.c [new file with mode: 0644]

index e61a2edd2b3e0ed6c2e7df4c37ce42b9005741f4..fd1c707f46b09e2e2197009e677678ede65dd13b 100644 (file)
@@ -1,3 +1,9 @@
+2015-12-16  Marek Polacek  <polacek@redhat.com>
+
+       PR c/64637
+       * c-typeck.c (c_process_expr_stmt): Use location of the expression if
+       available.
+
 2015-12-15  Marek Polacek  <polacek@redhat.com>
 
        PR c/68907
index 9d6c604ed909baa1c958f252f7a0bc595dab5ba9..a147ac6a7cedf5a5e60f4c560c2b5b6ba0c19479 100644 (file)
@@ -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)
index ebc8903ed1e5d78079f3655833cb087a60a4419b..7a66b14fecbfacc9fa375edcec322957fbf961bc 100644 (file)
@@ -1,3 +1,8 @@
+2015-12-16  Marek Polacek  <polacek@redhat.com>
+
+       PR c/64637
+       * gcc.dg/pr64637.c: New test.
+
 2015-12-16  Nathan Sidwell  <nathan@acm.org>
 
        * gcc.dg/sibcall-9.c: Xfail for nvptx.
diff --git a/gcc/testsuite/gcc.dg/pr64637.c b/gcc/testsuite/gcc.dg/pr64637.c
new file mode 100644 (file)
index 0000000..779ff50
--- /dev/null
@@ -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;
+   });
+}