diff options
| author | _ov4 <ov4@ov4.org> | 2026-10-17 15:12:01 +0000 |
|---|---|---|
| committer | _ov4 <ov4@ov4.org> | 2026-10-17 15:12:01 +0000 |
| commit | d4f28b089b2818d23df8543db3130ac760f37ad8 (patch) | |
| tree | 6d4eb4c5787b255ec0c44c7874d81d0fa5a225f3 /tests | |
| parent | 1b8851d95c737cf8ebc92977bc96d4bb838568f6 (diff) | |
test(extern): cover C library calls and EXTERN diagnostics
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/i/extern-libc/case.json | 3 | ||||
| -rw-r--r-- | tests/i/extern-libc/expected.txt | 5 | ||||
| -rw-r--r-- | tests/i/extern-libc/notes.md | 7 | ||||
| -rw-r--r-- | tests/i/extern-libc/program.cps | 18 | ||||
| -rw-r--r-- | tests/iii/extern-missing-symbol/case.json | 8 | ||||
| -rw-r--r-- | tests/iii/extern-missing-symbol/notes.md | 5 | ||||
| -rw-r--r-- | tests/iii/extern-missing-symbol/program.cps | 4 | ||||
| -rw-r--r-- | tests/iii/extern-pseudocode-type/case.json | 8 | ||||
| -rw-r--r-- | tests/iii/extern-pseudocode-type/notes.md | 5 | ||||
| -rw-r--r-- | tests/iii/extern-pseudocode-type/program.cps | 4 | ||||
| -rw-r--r-- | tests/iii/extern-variadic-type/case.json | 8 | ||||
| -rw-r--r-- | tests/iii/extern-variadic-type/notes.md | 5 | ||||
| -rw-r--r-- | tests/iii/extern-variadic-type/program.cps | 5 |
13 files changed, 85 insertions, 0 deletions
diff --git a/tests/i/extern-libc/case.json b/tests/i/extern-libc/case.json new file mode 100644 index 0000000..1f18635 --- /dev/null +++ b/tests/i/extern-libc/case.json @@ -0,0 +1,3 @@ +{ + "exit_code": 0 +} diff --git a/tests/i/extern-libc/expected.txt b/tests/i/extern-libc/expected.txt new file mode 100644 index 0000000..6c94a8c --- /dev/null +++ b/tests/i/extern-libc/expected.txt @@ -0,0 +1,5 @@ +hello +5 +4.000000 +42 x 1.5 -7| +12 diff --git a/tests/i/extern-libc/notes.md b/tests/i/extern-libc/notes.md new file mode 100644 index 0000000..99fa615 --- /dev/null +++ b/tests/i/extern-libc/notes.md @@ -0,0 +1,7 @@ +# extern-libc + +Human review: pending. Expected output was independently traced by AI, not captured from cpsc. + +Basis: compiler extension (EXTERN "C", INCLUDE_OBJ "__libc"); C library semantics. + +Trace: srand(1) has no output. puts prints "hello" and a newline. abs(-5)=5. sqrt(16)=4.0 printed as REAL-style C double "%f". printf receives int 42, "x", float 1.5 promoted to double, short -7 promoted to int, prints "42 x 1.5 -7|" (12 characters) with no newline; OUTPUT "" ends that line, then 12 is printed. diff --git a/tests/i/extern-libc/program.cps b/tests/i/extern-libc/program.cps new file mode 100644 index 0000000..2204969 --- /dev/null +++ b/tests/i/extern-libc/program.cps @@ -0,0 +1,18 @@ +// C library calls through EXTERN, including variadic promotions. +INCLUDE_OBJ "__libc" +TYPE CFloat = C_TYPE("float") +TYPE CShort = C_TYPE("short") +EXTERN "C" EXTERN_FUNCTION printf(C_STRING, ...) RETURNS C_INT +EXTERN "C" EXTERN_FUNCTION puts(C_STRING) RETURNS C_INT +EXTERN "C" EXTERN_FUNCTION abs(C_INT) RETURNS C_INT +EXTERN "C" EXTERN_FUNCTION sqrt(C_DOUBLE) RETURNS C_DOUBLE +TYPE CUnsigned = C_TYPE("unsigned int") +EXTERN "C" EXTERN_PROCEDURE srand(CUnsigned) +CALL srand((CUnsigned)1) +DECLARE Count : C_INT +CALL puts((C_STRING)"hello") +OUTPUT abs((C_INT)-5) +OUTPUT sqrt((C_DOUBLE)16) +Count <- printf((C_STRING)"%d %s %.1f %d|", (C_INT)42, (C_STRING)"x", (CFloat)1.5, (CShort)-7) +OUTPUT "" +OUTPUT Count diff --git a/tests/iii/extern-missing-symbol/case.json b/tests/iii/extern-missing-symbol/case.json new file mode 100644 index 0000000..46e37bd --- /dev/null +++ b/tests/iii/extern-missing-symbol/case.json @@ -0,0 +1,8 @@ +{ + "errors": [ + { + "reason": "C\\ symbol\\ .putz.\\ not\\ found", + "line": 3 + } + ] +} diff --git a/tests/iii/extern-missing-symbol/notes.md b/tests/iii/extern-missing-symbol/notes.md new file mode 100644 index 0000000..026481f --- /dev/null +++ b/tests/iii/extern-missing-symbol/notes.md @@ -0,0 +1,5 @@ +# extern-missing-symbol + +Compiler extension: every EXTERN symbol must be defined by an INCLUDE_OBJ input; putz is not in the C library. + +Require exit 1 and the cause on the EXTERN line. diff --git a/tests/iii/extern-missing-symbol/program.cps b/tests/iii/extern-missing-symbol/program.cps new file mode 100644 index 0000000..fa0a5aa --- /dev/null +++ b/tests/iii/extern-missing-symbol/program.cps @@ -0,0 +1,4 @@ +// putz is not defined by the C library. +INCLUDE_OBJ "__libc" +EXTERN "C" EXTERN_FUNCTION putz(C_STRING) RETURNS C_INT +OUTPUT 1 diff --git a/tests/iii/extern-pseudocode-type/case.json b/tests/iii/extern-pseudocode-type/case.json new file mode 100644 index 0000000..7b85f2c --- /dev/null +++ b/tests/iii/extern-pseudocode-type/case.json @@ -0,0 +1,8 @@ +{ + "errors": [ + { + "reason": "must\\ be\\ a\\ non-void\\ C\\ type", + "line": 3 + } + ] +} diff --git a/tests/iii/extern-pseudocode-type/notes.md b/tests/iii/extern-pseudocode-type/notes.md new file mode 100644 index 0000000..a40a957 --- /dev/null +++ b/tests/iii/extern-pseudocode-type/notes.md @@ -0,0 +1,5 @@ +# extern-pseudocode-type + +Compiler extension: EXTERN parameters accept only C types; INTEGER needs a C type such as C_INT. + +Require exit 1 and the cause on the EXTERN line. diff --git a/tests/iii/extern-pseudocode-type/program.cps b/tests/iii/extern-pseudocode-type/program.cps new file mode 100644 index 0000000..a4ec68c --- /dev/null +++ b/tests/iii/extern-pseudocode-type/program.cps @@ -0,0 +1,4 @@ +// EXTERN parameters must be C types. +INCLUDE_OBJ "__libc" +EXTERN "C" EXTERN_FUNCTION abs(INTEGER) RETURNS C_INT +OUTPUT 1 diff --git a/tests/iii/extern-variadic-type/case.json b/tests/iii/extern-variadic-type/case.json new file mode 100644 index 0000000..45fea44 --- /dev/null +++ b/tests/iii/extern-variadic-type/case.json @@ -0,0 +1,8 @@ +{ + "errors": [ + { + "reason": "Variadic\\ argument\\ 2\\ to\\ printf\\ must\\ be\\ a\\ C\\ value", + "line": 5 + } + ] +} diff --git a/tests/iii/extern-variadic-type/notes.md b/tests/iii/extern-variadic-type/notes.md new file mode 100644 index 0000000..3de1d69 --- /dev/null +++ b/tests/iii/extern-variadic-type/notes.md @@ -0,0 +1,5 @@ +# extern-variadic-type + +Compiler extension: variadic EXTERN arguments must be C values; the INTEGER literal 1 is not cast. + +Require exit 1 and the cause on the call line. diff --git a/tests/iii/extern-variadic-type/program.cps b/tests/iii/extern-variadic-type/program.cps new file mode 100644 index 0000000..23f1fe9 --- /dev/null +++ b/tests/iii/extern-variadic-type/program.cps @@ -0,0 +1,5 @@ +// Variadic arguments must be C values. +INCLUDE_OBJ "__libc" +EXTERN "C" EXTERN_FUNCTION printf(C_STRING, ...) RETURNS C_INT +DECLARE N : C_INT +N <- printf((C_STRING)"%d", 1) |
