From f7f5df01c416a10e3eb9508a7a7150c792a8b4ca Mon Sep 17 00:00:00 2001 From: _ov4 Date: Sat, 17 Oct 2026 15:22:23 +0000 Subject: feat(codegen): allow identical EXTERN redeclarations across files Repeated EXTERN declarations with the same signature share one C symbol, as C declarations do; conflicting signatures are errors. Co-Authored-By: Claude Opus 5.5 --- tests/iii/multifile-extern-conflict/case.json | 13 +++++++++++++ tests/iii/multifile-extern-conflict/lib.cps | 3 +++ tests/iii/multifile-extern-conflict/notes.md | 5 +++++ tests/iii/multifile-extern-conflict/program.cps | 4 ++++ 4 files changed, 25 insertions(+) create mode 100644 tests/iii/multifile-extern-conflict/case.json create mode 100644 tests/iii/multifile-extern-conflict/lib.cps create mode 100644 tests/iii/multifile-extern-conflict/notes.md create mode 100644 tests/iii/multifile-extern-conflict/program.cps (limited to 'tests/iii') diff --git a/tests/iii/multifile-extern-conflict/case.json b/tests/iii/multifile-extern-conflict/case.json new file mode 100644 index 0000000..1eb3f1d --- /dev/null +++ b/tests/iii/multifile-extern-conflict/case.json @@ -0,0 +1,13 @@ +{ + "sources": [ + "program.cps", + "lib.cps" + ], + "errors": [ + { + "reason": "Conflicting EXTERN declarations of abs", + "line": 3, + "file": "lib.cps" + } + ] +} diff --git a/tests/iii/multifile-extern-conflict/lib.cps b/tests/iii/multifile-extern-conflict/lib.cps new file mode 100644 index 0000000..2c15253 --- /dev/null +++ b/tests/iii/multifile-extern-conflict/lib.cps @@ -0,0 +1,3 @@ +// The result type differs from program.cps. +INCLUDE_OBJ "__libc" +EXTERN "C" EXTERN_FUNCTION abs(C_INT) RETURNS C_DOUBLE diff --git a/tests/iii/multifile-extern-conflict/notes.md b/tests/iii/multifile-extern-conflict/notes.md new file mode 100644 index 0000000..6ac25b7 --- /dev/null +++ b/tests/iii/multifile-extern-conflict/notes.md @@ -0,0 +1,5 @@ +# multifile-extern-conflict + +Compiler extension: repeated EXTERN declarations must have identical signatures; lib.cps changes the result type. + +Require exit 1 and the cause on the second declaration. diff --git a/tests/iii/multifile-extern-conflict/program.cps b/tests/iii/multifile-extern-conflict/program.cps new file mode 100644 index 0000000..058cd5e --- /dev/null +++ b/tests/iii/multifile-extern-conflict/program.cps @@ -0,0 +1,4 @@ +INCLUDE "lib.cps" +INCLUDE_OBJ "__libc" +EXTERN "C" EXTERN_FUNCTION abs(C_INT) RETURNS C_INT +OUTPUT abs((C_INT)-3) -- cgit v1.3.1-4-g156e