(* TEST: [-st] *) type main: string -> integer function entry: main type rec: [integer: x; integer: y] type T1: integer -> integer type T2: rec -> integer type llnode: [llnode: prev; integer: val; llnode: next] type list: integer -> llnode function foo : T1 function bar1 : T2 function bar2 : T2 function make_list : list make_list (a) := { [integer:orig_a; llnode: ret; llnode: curr; llnode: temp] if (a < 0 | a = 0) then { return null; } else { ret := reserve ret; ret.prev := null; ret.next := null; ret.val := a; while (0 < a) { temp := reserve temp; temp.prev := null; temp.next := null; temp.val := ret.val; if (a = orig_a) then { ret.next := temp; temp.prev := ret; curr := temp; } else { curr.next := temp; temp.prev := curr; curr := temp; } a := a - 1; } return ret; } } foo (x) := { return x * x; } bar1(a,b) := { return a * b; } bar2(r,s) := { if (r < s) then { while (!(r < s)) { r := r + 1; } } else { [integer: x] x := 0; while (x < 10) { r := r + s; } } return r * s; } entry (arg) := { [ integer: result ; rec: w; llnode: li; boolean: b] li := make_list(6, 7); result := foo(5); w := reserve w; w.x := 5; w.y := 7; result := bar1(w); result := bar2(5,7); return 'a'; }