aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
author_ov4 <ov4@ov4.org>2026-10-20 12:01:45 +0000
committer_ov4 <ov4@ov4.org>2026-10-20 12:01:45 +0000
commitbe964b4df4db9f42e0b7d615c1cbfa6cf268e646 (patch)
treed9257871558ec123e4e8437921fe6ac7b8836164 /tests
parent62b605c6c0ea13e9763c0a0115464007b13a8831 (diff)
fix(strings): preserve enclosing class lifetimes during assignment
Copy owned string fields without reconstructing or destroying their containing class, and retain rvalue ownership transfers. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Diffstat (limited to 'tests')
-rw-r--r--tests/i/string-aggregate-assignment/case.json1
-rw-r--r--tests/i/string-aggregate-assignment/expected.txt2
-rw-r--r--tests/i/string-aggregate-assignment/notes.md3
-rw-r--r--tests/i/string-aggregate-assignment/program.cps28
4 files changed, 34 insertions, 0 deletions
diff --git a/tests/i/string-aggregate-assignment/case.json b/tests/i/string-aggregate-assignment/case.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/tests/i/string-aggregate-assignment/case.json
@@ -0,0 +1 @@
+{}
diff --git a/tests/i/string-aggregate-assignment/expected.txt b/tests/i/string-aggregate-assignment/expected.txt
new file mode 100644
index 0000000..b5956eb
--- /dev/null
+++ b/tests/i/string-aggregate-assignment/expected.txt
@@ -0,0 +1,2 @@
+left:changed:0:0
+2:0
diff --git a/tests/i/string-aggregate-assignment/notes.md b/tests/i/string-aggregate-assignment/notes.md
new file mode 100644
index 0000000..592272d
--- /dev/null
+++ b/tests/i/string-aggregate-assignment/notes.md
@@ -0,0 +1,3 @@
+# Aggregate assignment with STRING fields
+
+Human review: pending. Default class assignment copies STRING fields independently, including self-assignment, without invoking the enclosing class's copy constructor or destructor. The two declared boxes are destroyed only when Check returns.
diff --git a/tests/i/string-aggregate-assignment/program.cps b/tests/i/string-aggregate-assignment/program.cps
new file mode 100644
index 0000000..9659437
--- /dev/null
+++ b/tests/i/string-aggregate-assignment/program.cps
@@ -0,0 +1,28 @@
+GLOBAL
+ DECLARE Destroyed : INTEGER
+ DECLARE Copies : INTEGER
+ENDGLOBAL
+CLASS Box
+ Text : STRING
+ OVERLOAD PROCEDURE NEW()
+ ENDPROCEDURE
+ OVERLOAD PROCEDURE NEW(BYREF Other : Box)
+ Text <- Other.Text
+ Copies <- Copies + 1
+ ENDPROCEDURE
+ PROCEDURE DELETE()
+ Destroyed <- Destroyed + 1
+ ENDPROCEDURE
+ENDCLASS
+PROCEDURE Check()
+ DECLARE A : Box
+ DECLARE B : Box
+ A.Text <- "left"
+ B.Text <- "right"
+ B <- A
+ B <- B
+ B.Text <- "changed"
+ OUTPUT A.Text, ":", B.Text, ":", Destroyed, ":", Copies
+ENDPROCEDURE
+CALL Check()
+OUTPUT Destroyed, ":", Copies