ORCA-C/Tests/Spec.Conform/SPC4.3.0.1.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

94 lines
3.3 KiB
C++

/*****************************************************************************/
/* */
/* Special Conformance Test 4.3.0.1: Ensure static variables and functions */
/* are not passed to the linker, and that */
/* extern variables and functions are */
/* passed to the linker */
/* */
/* Other files needed: spc4301.h - header file for separate compilation */
/* spc4301.1.cc - separately compiled file */
/* spc4301.2.cc - separately compiled file */
/* spc4301.exec - controls compilation and linking */
/* {workDisk}/spc4301.symt - linker's global symbol */
/* table for spc4.3.0.1.cc */
/* */
/* Special instructions: Use the EXEC file spc4301.exec to separately */
/* compile and link the three files. A symbol table */
/* is produced in the output file {workDisk}/ */
/* spc4301.symt. The tester should use the linker's */
/* symbol table to verify that only the extern */
/* functions and variables are in the global symbol */
/* table. In addition, the EXEC file will try to */
/* execute the program. If all is well, a Pass/Fail */
/* message will be written to standard out. */
/* */
/* The global functions are: ChangeChar, L0 */
/* The global variables are: real, i, longNum */
/* */
/*****************************************************************************/
#include <math.h>
#include <string.h>
#include "spc4301.h"
int printf(const char *, ...);
int main (void)
{
int count = 0;
static extended E1 (double x, float y);
static char ch;
char *chPtr;
extern int i;
extern long L0 (int *j);
count++;
i = 0;
while (chArray [i] != '\0')
{
ChangeChar (&chArray [i]);
++i;
}
chPtr = chArray;
if ((strcmp (chPtr, "bcde")) != 0)
goto Fail;
count++;
real = E1 (2.1, 1.5);
if ( (fabs (real - 3.15)) > 0.1 )
goto Fail;
count++;
ch = F1 (2.3, 'a');
if (ch != 'c')
goto Fail;
count++;
longNum = L0 ((int *) chArray);
if (longNum != 25442)
goto Fail;
printf ("Passed Special Conformance Test spc4.3.0.1\n");
return 0;
Fail:
printf ("Failed Special Conformance Test spc4.3.0.1: count = %d\n", count);
return 0;
}
/*****************************************************************************/
static extended E1 (double x, float y)
{
return (x * y);
}
/*****************************************************************************/
static int F1 (float a, char ch)
{
return ((long) a) + ((long) ch);
}