+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,
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
/* 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;
}
--- /dev/null
+/*\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