From c372c08dc940db58f1da9cadeb64b4cb3c837704 Mon Sep 17 00:00:00 2001 From: _ov4 Date: Sat, 17 Oct 2026 06:58:13 +0000 Subject: fix(classes): preserve method-only heap objects and document NEW Allocate at least one byte for method-only classes so their heap addresses remain usable through pointers. Complete constructor diagnostics, field-order and exception coverage, document construction and rebinding, and highlight NEW. Co-Authored-By: Claude Opus 5.5 --- tests/iii/class-constructor-array-args-error/case.json | 8 ++++++++ tests/iii/class-constructor-array-args-error/program.cps | 5 +++++ tests/iii/class-constructor-duplicate-error/case.json | 8 ++++++++ tests/iii/class-constructor-duplicate-error/program.cps | 6 ++++++ tests/iii/class-constructor-expression-error/case.json | 8 ++++++++ tests/iii/class-constructor-expression-error/program.cps | 4 ++++ tests/iii/class-constructor-function-error/case.json | 8 ++++++++ tests/iii/class-constructor-function-error/program.cps | 5 +++++ tests/iii/class-constructor-global-error/case.json | 8 ++++++++ tests/iii/class-constructor-global-error/program.cps | 2 ++ tests/iii/class-constructor-nested-new-error/case.json | 8 ++++++++ tests/iii/class-constructor-nested-new-error/program.cps | 5 +++++ tests/iii/class-new-errors/case.json | 12 ++++++++++++ tests/iii/class-new-errors/program.cps | 5 +++++ 14 files changed, 92 insertions(+) create mode 100644 tests/iii/class-constructor-array-args-error/case.json create mode 100644 tests/iii/class-constructor-array-args-error/program.cps create mode 100644 tests/iii/class-constructor-duplicate-error/case.json create mode 100644 tests/iii/class-constructor-duplicate-error/program.cps create mode 100644 tests/iii/class-constructor-expression-error/case.json create mode 100644 tests/iii/class-constructor-expression-error/program.cps create mode 100644 tests/iii/class-constructor-function-error/case.json create mode 100644 tests/iii/class-constructor-function-error/program.cps create mode 100644 tests/iii/class-constructor-global-error/case.json create mode 100644 tests/iii/class-constructor-global-error/program.cps create mode 100644 tests/iii/class-constructor-nested-new-error/case.json create mode 100644 tests/iii/class-constructor-nested-new-error/program.cps (limited to 'tests/iii') diff --git a/tests/iii/class-constructor-array-args-error/case.json b/tests/iii/class-constructor-array-args-error/case.json new file mode 100644 index 0000000..6677de3 --- /dev/null +++ b/tests/iii/class-constructor-array-args-error/case.json @@ -0,0 +1,8 @@ +{ + "errors": [ + { + "reason": "Unexpected token", + "line": 5 + } + ] +} diff --git a/tests/iii/class-constructor-array-args-error/program.cps b/tests/iii/class-constructor-array-args-error/program.cps new file mode 100644 index 0000000..d3c7369 --- /dev/null +++ b/tests/iii/class-constructor-array-args-error/program.cps @@ -0,0 +1,5 @@ +CLASS Box + PROCEDURE NEW(Number : INTEGER) + ENDPROCEDURE +ENDCLASS +DECLARE Items : ARRAY[1:2] OF Box(1) diff --git a/tests/iii/class-constructor-duplicate-error/case.json b/tests/iii/class-constructor-duplicate-error/case.json new file mode 100644 index 0000000..f26c170 --- /dev/null +++ b/tests/iii/class-constructor-duplicate-error/case.json @@ -0,0 +1,8 @@ +{ + "errors": [ + { + "reason": "Duplicate member new in class Box", + "line": 4 + } + ] +} diff --git a/tests/iii/class-constructor-duplicate-error/program.cps b/tests/iii/class-constructor-duplicate-error/program.cps new file mode 100644 index 0000000..0782c5e --- /dev/null +++ b/tests/iii/class-constructor-duplicate-error/program.cps @@ -0,0 +1,6 @@ +CLASS Box + PROCEDURE NEW() + ENDPROCEDURE + PROCEDURE new(Number : INTEGER) + ENDPROCEDURE +ENDCLASS diff --git a/tests/iii/class-constructor-expression-error/case.json b/tests/iii/class-constructor-expression-error/case.json new file mode 100644 index 0000000..3055433 --- /dev/null +++ b/tests/iii/class-constructor-expression-error/case.json @@ -0,0 +1,8 @@ +{ + "errors": [ + { + "reason": "NEW is only allowed on the right of an assignment", + "line": 4 + } + ] +} diff --git a/tests/iii/class-constructor-expression-error/program.cps b/tests/iii/class-constructor-expression-error/program.cps new file mode 100644 index 0000000..67addd5 --- /dev/null +++ b/tests/iii/class-constructor-expression-error/program.cps @@ -0,0 +1,4 @@ +CLASS Box + Value : INTEGER +ENDCLASS +OUTPUT NEW Box() diff --git a/tests/iii/class-constructor-function-error/case.json b/tests/iii/class-constructor-function-error/case.json new file mode 100644 index 0000000..f654a51 --- /dev/null +++ b/tests/iii/class-constructor-function-error/case.json @@ -0,0 +1,8 @@ +{ + "errors": [ + { + "reason": "constructor NEW must be a PROCEDURE", + "line": 2 + } + ] +} diff --git a/tests/iii/class-constructor-function-error/program.cps b/tests/iii/class-constructor-function-error/program.cps new file mode 100644 index 0000000..1daa9fe --- /dev/null +++ b/tests/iii/class-constructor-function-error/program.cps @@ -0,0 +1,5 @@ +CLASS Box + FUNCTION NEW() RETURNS INTEGER + RETURN 1 + ENDFUNCTION +ENDCLASS diff --git a/tests/iii/class-constructor-global-error/case.json b/tests/iii/class-constructor-global-error/case.json new file mode 100644 index 0000000..818dfca --- /dev/null +++ b/tests/iii/class-constructor-global-error/case.json @@ -0,0 +1,8 @@ +{ + "errors": [ + { + "reason": "constructor NEW is only allowed in a CLASS", + "line": 1 + } + ] +} diff --git a/tests/iii/class-constructor-global-error/program.cps b/tests/iii/class-constructor-global-error/program.cps new file mode 100644 index 0000000..4ba097a --- /dev/null +++ b/tests/iii/class-constructor-global-error/program.cps @@ -0,0 +1,2 @@ +PROCEDURE NEW() +ENDPROCEDURE diff --git a/tests/iii/class-constructor-nested-new-error/case.json b/tests/iii/class-constructor-nested-new-error/case.json new file mode 100644 index 0000000..414816c --- /dev/null +++ b/tests/iii/class-constructor-nested-new-error/case.json @@ -0,0 +1,8 @@ +{ + "errors": [ + { + "reason": "NEW is only allowed on the right of an assignment", + "line": 5 + } + ] +} diff --git a/tests/iii/class-constructor-nested-new-error/program.cps b/tests/iii/class-constructor-nested-new-error/program.cps new file mode 100644 index 0000000..b0bd349 --- /dev/null +++ b/tests/iii/class-constructor-nested-new-error/program.cps @@ -0,0 +1,5 @@ +CLASS Box + PROCEDURE NEW(Other : Box) + ENDPROCEDURE +ENDCLASS +DECLARE Item : Box(NEW Box) diff --git a/tests/iii/class-new-errors/case.json b/tests/iii/class-new-errors/case.json index 8ce52ed..7f33ffd 100644 --- a/tests/iii/class-new-errors/case.json +++ b/tests/iii/class-new-errors/case.json @@ -27,6 +27,18 @@ { "reason": "NEW target must have type Hidden", "line": 26 + }, + { + "reason": "Cannot access private method NEW of type Hidden", + "line": 28 + }, + { + "reason": "has no constructor NEW", + "line": 30 + }, + { + "reason": "Cannot coerce value of LLVM type to target type INTEGER", + "line": 31 } ] } diff --git a/tests/iii/class-new-errors/program.cps b/tests/iii/class-new-errors/program.cps index 3a9e9c2..78db102 100644 --- a/tests/iii/class-new-errors/program.cps +++ b/tests/iii/class-new-errors/program.cps @@ -24,3 +24,8 @@ B <- NEW Box(1) R <- NEW Required R <- NEW Required() B <- NEW Hidden +PROCEDURE Forbidden(Target : Hidden) + Target <- NEW Hidden() +ENDPROCEDURE +B <- NEW Box("bad") +R <- NEW Required("bad") -- cgit v1.3.1-4-g156e