ORCA-C/Tests/Conformance/C4.5.3.3.CC
Stephen Heumann 91d33b586d Fix various C99+ conformance issues and bugs in test cases.
The main changes made to most tests are:

*Declarations always include explicit types, not relying on implicit int. The declaration of main in most test programs is changed to be "int main (void) {...}", adding an explicit return type and a prototype. (There are still some non-prototyped functions, though.)

*Functions are always declared before use, either by including a header or by providing a declaration for the specific function. The latter approach is usually used for printf, to avoid requiring ORCA/C to process stdio.h when compiling every test case (which might make test runs noticeably slower).

*Make all return statements in non-void functions (e.g. main) return a value.

*Avoid some instances of undefined behavior and type errors in printf and scanf calls.

Several miscellaneous bugs are also fixed.

There are still a couple test cases that intentionally rely on the C89 behavior, to ensure it still works.
2022-10-17 20:17:24 -05:00

132 lines
4.4 KiB
C++

/* Conformance Test 4.5.3.3: Verfication of local array declarations: arrays */
/* of pointers */
#include <math.h>
int printf(const char *, ...);
int main (void)
{
int i, j, k, n; /* loop indices */
long L; /* l-values */
float f;
double d;
extended e;
comp cmp;
unsigned int ui;
unsigned long ul;
char ch;
int *i1 [50]; /* all basic types */
long *L1 [9];
comp *c1 [3];
char *ch1 [10];
float *f1 [3];
double *d1 [8];
extended *e1 [9];
unsigned int ui3 [4] [5] [1], *ui1 [7];
unsigned long ul2 [5] [3], *ul1 [1];
/* conglomerate types */
struct s { int a;
float f; } *s1 [10], S;
enum colors { red, black, green } *en [6], C;
union longOrShort { int first;
long second; } *u1 [12], U;
for (i = 0; i < 10; i++) /* assign & check singly-dimensioned */
ch1 [i] = &ch; /* array of pointers to character */
ch = 'z';
for (i = 9; i >= 0; i--)
if (*(ch1 [i]) != 'z')
goto Fail;
for (i = 0; i < 50; i++) /* assign & check singly-dimensioned */
i1 [i] = &n; /* array of pointers to int */
n = 32767;
for (i = 49; i >= 0; i--)
if (*(i1 [i]) != 32767)
goto Fail;
for (i = 8; i >= 0; i--) /* assign & check singly-dimensioned */
L1 [i] = &L; /* array of pointers to long int */
L = 2147483647;
for (i = 0; i < 9; i++)
if (*(L1 [i]) != 2147483647)
goto Fail;
for (i = 0; i < 7; i++) /* assign & check singly-dimensioned */
ui1 [i] = &ui; /* array of ptrs to unsigned int */
ui = 65535;
for (i = 6; i >= 0; i--)
if (*(ui1 [i]) != 65535)
goto Fail;
ul1 [0] = &ul; /* assign & check singly-dimensioned */
ul = 4294967295ul; /* array of ptrs to long unsigned int*/
if (*(ul1 [0]) != 0xffffffff)
goto Fail;
for (i = 0; i < 3; i++) /* assign & check singly-dimensioned */
c1 [i] = &cmp; /* array of pointers to comp */
cmp = 4;
for (j = 2; j >= 0; j--)
if (*(c1 [j]) != 4)
goto Fail;
f1 [0] = f1 [1] = f1 [2] = &f; /* assign & check singly-dimensioned */
f = 32.8; /* array of pointers to float */
for (k = 0; k < 3; k++)
if (fabs(*(f1 [k]) - 32.8) > 0.00001)
goto Fail;
for (i = 0; i < 8; i++) /* assign & check singly- */
d1 [i] = &d; /* dimensioned array of */
d = 123.0e50; /* pointers to double */
for (k = 7; k >= 0; k--)
if (fabs(*(d1 [k]) - (double)0.123E53) > 0.00001)
goto Fail;
for (k = 8; k >= 0; k--) /* assign & check singly-dimensioned */
e1 [k] = &e; /* array of pointers to extended */
e = 0.0e-300;
for (i = 0; i < 9; i++)
if (*(e1 [i]) != 0)
goto Fail;
for (i = 0; i < 10; i++) /* assign & check singly-dimensioned */
s1 [i] = &S; /* array of pointers to structures */
S.a = 7;
S.f = 6.4;
for (i = 9; i >= 0; i--)
if ((s1 [i]->a != 7) || (fabs(s1 [i]->f - 6.4) > 0.00001))
goto Fail;
for (n = 5; n >= 0; n--) /* assign & check singly-dimensioned */
en [n] = &C; /* array of pointers to enumerations*/
C = black;
for (k = 0; k < 6; k++)
if (*(en [k]) != 1)
goto Fail;
for (i = 0; i < 12; i++) /* assign & check singly-dimensioned */
u1 [i] = &U; /* array of pointers to union */
U.first = -45;
for (k = 11; k >= 0; k--)
if (u1 [k]->first != -45)
goto Fail;
U.second = 32770;
for (n = 11; n >= 0; n--)
if (u1 [n]->second != 32770)
goto Fail;
printf ("Passed Conformance Test 4.5.3.3\n");
return 0;
Fail:
printf ("Failed Conformance Test 4.5.3.3\n");
}