aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
author_ov4 <ov4@ov4.org>2026-10-17 15:12:01 +0000
committer_ov4 <ov4@ov4.org>2026-10-17 15:12:01 +0000
commitd4f28b089b2818d23df8543db3130ac760f37ad8 (patch)
tree6d4eb4c5787b255ec0c44c7874d81d0fa5a225f3 /tests
parent1b8851d95c737cf8ebc92977bc96d4bb838568f6 (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.json3
-rw-r--r--tests/i/extern-libc/expected.txt5
-rw-r--r--tests/i/extern-libc/notes.md7
-rw-r--r--tests/i/extern-libc/program.cps18
-rw-r--r--tests/iii/extern-missing-symbol/case.json8
-rw-r--r--tests/iii/extern-missing-symbol/notes.md5
-rw-r--r--tests/iii/extern-missing-symbol/program.cps4
-rw-r--r--tests/iii/extern-pseudocode-type/case.json8
-rw-r--r--tests/iii/extern-pseudocode-type/notes.md5
-rw-r--r--tests/iii/extern-pseudocode-type/program.cps4
-rw-r--r--tests/iii/extern-variadic-type/case.json8
-rw-r--r--tests/iii/extern-variadic-type/notes.md5
-rw-r--r--tests/iii/extern-variadic-type/program.cps5
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)