re PR c/16348 (Loop gets executed when it shouldnt)
authorRichard Henderson <rth@redhat.com>
Sun, 4 Jul 2004 17:28:56 +0000 (10:28 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Sun, 4 Jul 2004 17:28:56 +0000 (10:28 -0700)
        PR c/16348
        * c-typeck.c (c_finish_loop): Don't clear cond for cond_is_first loops.

From-SVN: r84089

gcc/ChangeLog
gcc/c-typeck.c
gcc/testsuite/gcc.c-torture/execute/20040704-1.c [new file with mode: 0644]

index 06abd111a2e86ff3d9c16f44b9724154faa90b08..86ebbf54b4a385825042bd53e7903a8c9ad182de 100644 (file)
@@ -1,3 +1,8 @@
+2004-07-04  Richard Henderson  <rth@redhat.com>
+
+       PR c/16348
+       * c-typeck.c (c_finish_loop): Don't clear cond for cond_is_first loops.
+
 2004-07-04  Mark Mitchell  <mark@codesourcery.com>
 
        * configure.ac (ranlib_flags): New variable.
index e5f94915cf2327295e5d375a912d2151e79d6b91..b704fab47ead640990acd6004aae9391ed5504b0 100644 (file)
@@ -6554,11 +6554,9 @@ c_finish_loop (location_t start_locus, tree cond, tree incr, tree body,
 {
   tree entry = NULL, exit = NULL, t;
 
-  /* Force zeros to NULL so that we don't test them.  */
-  if (cond && integer_zerop (cond))
-    cond = NULL;
-
   /* Detect do { ... } while (0) and don't generate loop construct.  */
+  if (cond && !cond_is_first && integer_zerop (cond))
+    cond = NULL;
   if (cond_is_first || cond)
     {
       tree top = build1 (LABEL_EXPR, void_type_node, NULL_TREE);
diff --git a/gcc/testsuite/gcc.c-torture/execute/20040704-1.c b/gcc/testsuite/gcc.c-torture/execute/20040704-1.c
new file mode 100644 (file)
index 0000000..c6b23d0
--- /dev/null
@@ -0,0 +1,14 @@
+/* PR 16348: Make sure that condition-first false loops DTRT.  */
+
+extern void abort ();
+
+int main()
+{
+  for (; 0 ;)
+    {
+      abort ();
+    label:
+      return 0;
+    }
+  goto label;
+}