diff options
| author | _ov4 <ov4@ov4.org> | 2026-10-17 06:58:13 +0000 |
|---|---|---|
| committer | _ov4 <ov4@ov4.org> | 2026-10-17 06:58:13 +0000 |
| commit | c372c08dc940db58f1da9cadeb64b4cb3c837704 (patch) | |
| tree | 70636fd3a485eaf16fb7f442c294ac066c76e1a1 /tests/iii | |
| parent | 74b6d06711afd3efbbc47436f1491900994313f3 (diff) | |
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 <noreply@anthropic.com>
Diffstat (limited to 'tests/iii')
14 files changed, 92 insertions, 0 deletions
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") |
