as reported in http://lists.nongnu.org/archive/html/tinycc-devel/2015-04/msg00131.html. Note that this is one of two separate VLA bugs: A. labels aren't reached by program execution, so the stack pointer is never saved B. continue doesn't restore the stack pointer as goto does This fixes only B. I'm not sure whether the same issue applies to break as well as continue. Add a test case, but disable tests #78 and #79 for now as they're not fully fixed until the issue described in http://lists.nongnu.org/archive/html/tinycc-devel/2015-04/msg00110.html is resolved.
93 lines
1006 B
C
93 lines
1006 B
C
#include <stdio.h>
|
|
|
|
int f(void)
|
|
{
|
|
return 5;
|
|
}
|
|
|
|
void test1()
|
|
{
|
|
int count = 10;
|
|
void *addr[10];
|
|
for(;count--;) {
|
|
int a[f()];
|
|
|
|
addr[count] = a;
|
|
|
|
continue;
|
|
}
|
|
|
|
if(addr[9] == addr[0]) {
|
|
printf("OK\n");
|
|
} else {
|
|
printf("NOT OK\n");
|
|
}
|
|
}
|
|
|
|
void test2()
|
|
{
|
|
int count = 10;
|
|
void *addr[count];
|
|
for(;count--;) {
|
|
int a[f()];
|
|
|
|
addr[count] = a;
|
|
|
|
continue;
|
|
}
|
|
|
|
if(addr[9] == addr[0]) {
|
|
printf("OK\n");
|
|
} else {
|
|
printf("NOT OK\n");
|
|
}
|
|
}
|
|
|
|
void test3()
|
|
{
|
|
int count = 10;
|
|
void *addr[count];
|
|
while(count--) {
|
|
int a[f()];
|
|
|
|
addr[count] = a;
|
|
|
|
continue;
|
|
}
|
|
|
|
if(addr[9] == addr[0]) {
|
|
printf("OK\n");
|
|
} else {
|
|
printf("NOT OK\n");
|
|
}
|
|
}
|
|
|
|
void test4()
|
|
{
|
|
int count = 10;
|
|
void *addr[count];
|
|
do {
|
|
int a[f()];
|
|
|
|
addr[count] = a;
|
|
|
|
continue;
|
|
} while(count--);
|
|
|
|
if(addr[9] == addr[0]) {
|
|
printf("OK\n");
|
|
} else {
|
|
printf("NOT OK\n");
|
|
}
|
|
}
|
|
|
|
int main(void)
|
|
{
|
|
test1();
|
|
test2();
|
|
test3();
|
|
test4();
|
|
|
|
return 0;
|
|
}
|