aboutsummaryrefslogtreecommitdiff
path: root/tests/iii
diff options
context:
space:
mode:
author_ov4 <ov4@ov4.org>2026-10-17 06:58:13 +0000
committer_ov4 <ov4@ov4.org>2026-10-17 06:58:13 +0000
commitc372c08dc940db58f1da9cadeb64b4cb3c837704 (patch)
tree70636fd3a485eaf16fb7f442c294ac066c76e1a1 /tests/iii
parent74b6d06711afd3efbbc47436f1491900994313f3 (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')
-rw-r--r--tests/iii/class-constructor-array-args-error/case.json8
-rw-r--r--tests/iii/class-constructor-array-args-error/program.cps5
-rw-r--r--tests/iii/class-constructor-duplicate-error/case.json8
-rw-r--r--tests/iii/class-constructor-duplicate-error/program.cps6
-rw-r--r--tests/iii/class-constructor-expression-error/case.json8
-rw-r--r--tests/iii/class-constructor-expression-error/program.cps4
-rw-r--r--tests/iii/class-constructor-function-error/case.json8
-rw-r--r--tests/iii/class-constructor-function-error/program.cps5
-rw-r--r--tests/iii/class-constructor-global-error/case.json8
-rw-r--r--tests/iii/class-constructor-global-error/program.cps2
-rw-r--r--tests/iii/class-constructor-nested-new-error/case.json8
-rw-r--r--tests/iii/class-constructor-nested-new-error/program.cps5
-rw-r--r--tests/iii/class-new-errors/case.json12
-rw-r--r--tests/iii/class-new-errors/program.cps5
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")