Fixed the handling of "while (0) {}".

It's a corner case; but, conditional macroes might create it -- better safe than sorry.
This commit is contained in:
Greg King
2017-04-07 09:26:58 -04:00
parent e43dbe1c24
commit 1aab287189
2 changed files with 88 additions and 34 deletions

View File

@@ -1,53 +1,107 @@
/*
!!DESCRIPTION!!
!!DESCRIPTION!! while-condition tests
!!ORIGIN!! SDCC regression tests
!!LICENCE!! GPL, read COPYING.GPL
*/
#include <stdio.h>
#include <limits.h>
unsigned char success = 0;
unsigned char failures = 0;
unsigned char dummy = 0;
static unsigned char failures = 0x00;
static unsigned char achar0 = 0;
#ifdef SUPPORT_BIT_TYPES
bit bit0 = 0;
#endif
unsigned int aint0 = 0;
unsigned int aint1 = 0;
unsigned char achar0 = 0;
unsigned char achar1 = 0;
void
done ()
{
dummy++;
}
void
static void
while1 (void)
{
unsigned char i = 10;
do
{
achar0++;
}
while (--i);
do {
++achar0;
} while (--i);
if (achar0 != 10)
failures++;
if (achar0 != 10) {
failures |= 0x01;
}
}
static void
while2 (void)
{
unsigned char i = 10;
achar0 = 0;
while (--i) {
++achar0;
}
if (achar0 != 10 - 1) {
failures |= 0x02;
}
}
static void
while3 (void)
{
achar0 = 0;
do {
if (++achar0 == (unsigned char)0) {
return;
}
} while (1);
failures |= 0x04;
}
static void
while4 (void)
{
achar0 = 0;
while (1) {
if (++achar0 == (unsigned char)0) {
return;
}
}
failures |= 0x08;
}
static void
while5 (void)
{
achar0 = 0;
do {
++achar0;
} while (0);
if (achar0 != 1) {
failures |= 0x10;
}
}
static void
while6 (void)
{
achar0 = 0;
while (0) {
++achar0;
}
if (achar0 != 1 - 1) {
failures |= 0x20;
}
}
int
main (void)
{
while1 ();
while2 ();
while3 ();
while4 ();
while5 ();
while6 ();
success = failures;
done ();
printf("failures: %d\n",failures);
if (failures) {
printf("failures: 0x%02X\n", failures);
}
return failures;
}