diff options
| author | _ov4 <ov4@ov4.org> | 2026-10-20 12:01:45 +0000 |
|---|---|---|
| committer | _ov4 <ov4@ov4.org> | 2026-10-20 12:01:45 +0000 |
| commit | be964b4df4db9f42e0b7d615c1cbfa6cf268e646 (patch) | |
| tree | d9257871558ec123e4e8437921fe6ac7b8836164 /tests/i/string-aggregate-assignment | |
| parent | 62b605c6c0ea13e9763c0a0115464007b13a8831 (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/i/string-aggregate-assignment')
| -rw-r--r-- | tests/i/string-aggregate-assignment/case.json | 1 | ||||
| -rw-r--r-- | tests/i/string-aggregate-assignment/expected.txt | 2 | ||||
| -rw-r--r-- | tests/i/string-aggregate-assignment/notes.md | 3 | ||||
| -rw-r--r-- | tests/i/string-aggregate-assignment/program.cps | 28 |
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 |
