diff options
| author | Eugen Wissner <belka@caraus.de> | 2026-08-30 02:08:45 +0200 |
|---|---|---|
| committer | Eugen Wissner <belka@caraus.de> | 2026-08-30 02:08:45 +0200 |
| commit | 491e62664394a8689a3f8904fbe8dbc3dea05524 (patch) | |
| tree | 7142cf8d94fc6f9cf953d42d9c136b77f65d8034 /testsuite/runnable | |
| parent | 08d9c4292ebba3e320c1dbaca4fa06c83f6fc7fb (diff) | |
| download | elna-491e62664394a8689a3f8904fbe8dbc3dea05524.tar.gz | |
Fix ICEs with recursive type declarations
Diffstat (limited to 'testsuite/runnable')
| -rw-r--r-- | testsuite/runnable/recursive_record.elna | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/testsuite/runnable/recursive_record.elna b/testsuite/runnable/recursive_record.elna new file mode 100644 index 0000000..6f6b4fa --- /dev/null +++ b/testsuite/runnable/recursive_record.elna @@ -0,0 +1,48 @@ +type + Node = record + value: Int; + next: ^Node + end + +var + first: ^Node + second: ^Node + third: ^Node + +proc malloc(size: Word): Pointer +extern + +proc free(ptr: Pointer) +extern + +proc sum(node: ^Node): Int +var + result: Int +begin + result := 0; + if node = nil then + result := 0 + else + result := node^.value + sum(node^.next) + end; + return result + +begin + first := malloc(#size(Node)); + second := malloc(#size(Node)); + third := malloc(#size(Node)); + + first^.value := 1; + first^.next := second; + second^.value := 2; + second^.next := third; + third^.value := 3; + third^.next := nil; + + assert(sum(first) = 6); + assert(first^.next^.next^.value = 3); + + free(first); + free(second); + free(third) +end. |
