re PR debug/83547 ((statement-frontiers) error: void value not ignored as it ought...
authorJakub Jelinek <jakub@redhat.com>
Fri, 22 Dec 2017 18:01:58 +0000 (19:01 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 22 Dec 2017 18:01:58 +0000 (19:01 +0100)
PR debug/83547
* tree-iterator.c (alloc_stmt_list): Start with cleared
TREE_SIDE_EFFECTS regardless whether a new STATEMENT_LIST is allocated
or old one reused.
c/
* c-typeck.c (c_finish_stmt_expr): Ignore !TREE_SIDE_EFFECTS as
indicator of ({ }), instead skip all trailing DEBUG_BEGIN_STMTs first,
and consider empty ones if there are no other stmts.  For
-Wunused-value walk all statements before the one only followed by
DEBUG_BEGIN_STMTs.
testsuite/
* gcc.c-torture/compile/pr83547.c: New test.

From-SVN: r255980

gcc/ChangeLog
gcc/c/ChangeLog
gcc/c/c-typeck.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/pr83547.c [new file with mode: 0644]
gcc/tree-iterator.c

index a75db0731afc4264034c7fe4f691bc0a28d354ba..aba9ae7ea5a4bb3b4ebb08a37a06c83c3524b178 100644 (file)
@@ -1,5 +1,10 @@
 2017-12-22  Jakub Jelinek  <jakub@redhat.com>
 
+       PR debug/83547
+       * tree-iterator.c (alloc_stmt_list): Start with cleared
+       TREE_SIDE_EFFECTS regardless whether a new STATEMENT_LIST is allocated
+       or old one reused.
+
        PR target/83488
        * config/i386/avx512vnniintrin.h: Don't check for __AVX512F__ nor
        enable avx512f explicitly in #pragma GCC target.
index f4756c800a17463c03c34c32684f45494d16de2e..581f7df149b18f1b456e63045165c117fa21164d 100644 (file)
@@ -1,3 +1,12 @@
+2017-12-22  Jakub Jelinek  <jakub@redhat.com>
+
+       PR debug/83547
+       * c-typeck.c (c_finish_stmt_expr): Ignore !TREE_SIDE_EFFECTS as
+       indicator of ({ }), instead skip all trailing DEBUG_BEGIN_STMTs first,
+       and consider empty ones if there are no other stmts.  For
+       -Wunused-value walk all statements before the one only followed by
+       DEBUG_BEGIN_STMTs.
+
 2017-12-22  Mike Stump  <mikestump@comcast.net>
             Eric Botcazou  <ebotcazou@adacore.com>
 
index 5ae12d9c8a987690f748742a025ea9396fd6dd3b..98062c76b90bed16c0849b17520e0609820a1011 100644 (file)
@@ -10751,17 +10751,21 @@ c_finish_stmt_expr (location_t loc, tree body)
  continue_searching:
   if (TREE_CODE (last) == STATEMENT_LIST)
     {
-      tree_stmt_iterator i;
+      tree_stmt_iterator l = tsi_last (last);
+
+      while (!tsi_end_p (l) && TREE_CODE (tsi_stmt (l)) == DEBUG_BEGIN_STMT)
+       tsi_prev (&l);
 
       /* This can happen with degenerate cases like ({ }).  No value.  */
-      if (!TREE_SIDE_EFFECTS (last))
+      if (tsi_end_p (l))
        return body;
 
       /* If we're supposed to generate side effects warnings, process
         all of the statements except the last.  */
       if (warn_unused_value)
        {
-         for (i = tsi_start (last); !tsi_one_before_end_p (i); tsi_next (&i))
+         for (tree_stmt_iterator i = tsi_start (last);
+              tsi_stmt (i) != tsi_stmt (l); tsi_next (&i))
            {
              location_t tloc;
              tree t = tsi_stmt (i);
@@ -10770,13 +10774,7 @@ c_finish_stmt_expr (location_t loc, tree body)
              emit_side_effect_warnings (tloc, t);
            }
        }
-      else
-       i = tsi_last (last);
-      if (TREE_CODE (tsi_stmt (i)) == DEBUG_BEGIN_STMT)
-       do
-         tsi_prev (&i);
-       while (TREE_CODE (tsi_stmt (i)) == DEBUG_BEGIN_STMT);
-      last_p = tsi_stmt_ptr (i);
+      last_p = tsi_stmt_ptr (l);
       last = *last_p;
     }
 
index 297e80fe17f6fa0b13dd254a946e4f652fe8df88..0102564068cc99ffb9deef21bcb1e35f47733037 100644 (file)
@@ -1,5 +1,8 @@
 2017-12-22  Jakub Jelinek  <jakub@redhat.com>
 
+       PR debug/83547
+       * gcc.c-torture/compile/pr83547.c: New test.
+
        PR target/83488
        * gcc.target/i386/pr83488-2.c: New test.
        * gcc.target/i386/pr83488-3.c: New test.
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr83547.c b/gcc/testsuite/gcc.c-torture/compile/pr83547.c
new file mode 100644 (file)
index 0000000..98a1e04
--- /dev/null
@@ -0,0 +1,16 @@
+/* PR debug/83547 */
+
+void
+foo (void)
+{
+  if (({ 0; }))
+    ;
+  if (({ 0; 0; }))
+    ;
+  if (({ }))           /* { dg-error "void value not ignored as it ought to be" } */
+    ;
+  if (({ 0; { 0; } })) /* { dg-error "void value not ignored as it ought to be" } */
+    ;
+  if (({ 0; {} }))     /* { dg-error "void value not ignored as it ought to be" } */
+    ;
+}
index 10e510db0921715657c3fad466ca4725bf10dc8e..b0b88f4d2c751bf26067ad6aac15e25292d109d1 100644 (file)
@@ -41,7 +41,10 @@ alloc_stmt_list (void)
       TREE_SET_CODE (list, STATEMENT_LIST);
     }
   else
-    list = make_node (STATEMENT_LIST);
+    {
+      list = make_node (STATEMENT_LIST);
+      TREE_SIDE_EFFECTS (list) = 0;
+    }
   TREE_TYPE (list) = void_type_node;
   return list;
 }