(* Check manually *)
(* This test should only create two instances of f. *)
const c:int = 3
const k:int = 1

fun f<<n:int>>() returns (y:int)
let
  y = n + 3 + c;
tel

fun g<<m:int>>() returns (y:int)
var x:int;
let
  x = m + f<<2>>();
  y = f<<m>>();
tel

fun i<<m:int>>() returns (o : int)
var x, y, z: int;
let
  x = f<<2>>();
  y = f<<1 + m>>();
  z = f<<k + 1>>();
  o = f<<m + k>>();
tel

fun h() returns (y:int)
let
  y = c + g<<c>>() + i<<k>>();
tel

node main() returns (y:int)
let
  y = h()
tel