1
0
mirror of https://github.com/catseye/SixtyPical.git synced 2025-02-16 15:30:26 +00:00

Articulate the "union rule" for trashes in if, add failing tests.

This commit is contained in:
Chris Pressey 2018-02-08 12:46:28 +00:00
parent 69f69d35a4
commit cde2824c44

View File

@ -1232,6 +1232,21 @@ initialized, either because it was set previous to the `if`, or is an
input to the routine, and it is initialized in one branch, it need not input to the routine, and it is initialized in one branch, it need not
be initialized in the other. be initialized in the other.
| routine foo
| outputs x
| trashes a, z, n, c
| {
| ld x, 0
| ld a, 0
| cmp a, 42
| if z {
| ld x, 7
| } else {
| ld a, 23
| }
| }
= ok
| routine foo | routine foo
| inputs x | inputs x
| outputs x | outputs x
@ -1287,6 +1302,46 @@ An `if` with a single block is analyzed as if it had an empty `else` block.
| } | }
= ok = ok
The cardinal rule for trashes in an `if` is the "union rule": if one branch
trashes {`a`} and the other branch trashes {`b`} then the whole `if` statement
trashes {`a`, `b`}.
| routine foo
| inputs a, x, z
| trashes a, x
| {
| if z {
| trash a
| } else {
| trash x
| }
| }
= ok
| routine foo
| inputs a, x, z
| trashes a
| {
| if z {
| trash a
| } else {
| trash x
| }
| }
? UnmeaningfulOutputError: x in foo
| routine foo
| inputs a, x, z
| trashes x
| {
| if z {
| trash a
| } else {
| trash x
| }
| }
? UnmeaningfulOutputError: a in foo
### repeat ### ### repeat ###
Repeat loop. Repeat loop.