aboutsummaryrefslogtreecommitdiff
path: root/testsuite/runnable
diff options
context:
space:
mode:
Diffstat (limited to 'testsuite/runnable')
-rw-r--r--testsuite/runnable/recursive_record.elna48
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.