* src/SDCCast.c (createDo): backPatchLabels() needs falseLabel in empty 'while'-loop...
authorbernhardheld <bernhardheld@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Mon, 1 Jan 2007 20:42:04 +0000 (20:42 +0000)
committerbernhardheld <bernhardheld@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Mon, 1 Jan 2007 20:42:04 +0000 (20:42 +0000)
* support/regression/tests/while.c: added

git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@4550 4a8a32a2-be11-0410-ad9d-d568d2c75423

ChangeLog
src/SDCCast.c
support/regression/tests/while.c [new file with mode: 0644]

index 1bb517aa15bba79b0100f873affdf00ea5f0e309..63a8cf9bce285b45bb6a1fa47ee990e511a2de85 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2007-01-01 Bernhard Held <bernhard AT bernhardheld.de>
+
+       * src/SDCCast.c (createDo): backPatchLabels() needs falseLabel in
+       empty 'while'-loop to work correctly, see regression test 'while.c'
+       * support/regression/tests/while.c: added
+
 2007-01-01 Borut Razem <borut.razem AT siol.net>
 
        * support/cpp2/libcpp/directives.c, support/cpp2/libcpp/identifiers.c,
@@ -71,6 +77,7 @@
          and flex are not installed, 2nd try
 
 2006-12-30 Bernhard Held <bernhard AT bernhardheld.de>
+
        * src/mcs51/peeph.def: renamed rule 400 to 500, moved rule 253.x to
        400.x for better code in RFE 899102
 
index 99582eef1a7bb8de13b71da86192976697a70a78..def33ed0f4a15f5cd781f808c3b75a666bda0993 100644 (file)
@@ -5148,11 +5148,13 @@ createDo (symbol * trueLabel, symbol * continueLabel,
   /* if the body does not exist then it is simple */
   if (!doBody)
     {
-      condAst = backPatchLabels (condAst, continueLabel, NULL);
+      condAst = backPatchLabels (condAst, continueLabel, falseLabel);
       doTree = (IS_IFX (condAst) ? createLabel (continueLabel, condAst)
                 : newNode (IFX, createLabel (continueLabel, condAst), NULL));
       doTree->trueLabel = continueLabel;
       doTree->falseLabel = NULL;
+
+      doTree = newNode (NULLOP, doTree, createLabel (falseLabel, NULL));
       return doTree;
     }
 
diff --git a/support/regression/tests/while.c b/support/regression/tests/while.c
new file mode 100644 (file)
index 0000000..f38ae9b
--- /dev/null
@@ -0,0 +1,30 @@
+/*\r
+   while.c\r
+*/\r
+\r
+#include <testfwk.h>\r
+\r
+char c1 = 0, c2 = 1;\r
+\r
+void\r
+testEmptyWhile(void)\r
+{\r
+  /* loops forever if bug ist present */\r
+  do {} while (c1 && c2);\r
+\r
+  /* other cases: */\r
+  do {} while ( c1 &&  c1);\r
+  do {} while ( c1 && !c2);\r
+  do {} while (!c1 && !c2);\r
+  do {} while ( c2 &&  c1);\r
+  do {} while (!c2 &&  c1);\r
+  do {} while (!c2 && !c1);\r
+  do {} while (!c2 && !c2);\r
+\r
+  do {} while ( c1 ||  c1);\r
+  do {} while ( c1 || !c2);\r
+  do {} while (!c2 ||  c1);\r
+  do {} while (!c2 || !c2);\r
+\r
+  ASSERT(1);\r
+}\r