summaryrefslogtreecommitdiff
path: root/test/ocaml/reg_passing/reg_passing.sail
blob: 01a310e621d72bcb6f8ad30e181af48678f04f6c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
register R1 : int
register R2 : int
register R3 : int

val cast "reg_deref" : forall ('a : Type). register('a) -> 'a effect {rreg}
val output = {
    ocaml: "(fun (str, n) -> print_endline (str ^ Big_int.to_string n))",
    interpreter: "print_int"
  } : (string, int) -> unit

val f : register(int) -> unit effect {rreg, wreg}

function f R = {
  R1 = R;
}

val g : unit -> unit effect {rreg, wreg}

function g () = {
  f(ref R1);
  f(ref R2);
}

val main : unit -> unit effect {rreg, wreg}

function main () = {
  R1 = 4;
  R2 = 5;
  g ();
  R3 = 10;
  f(ref R3);
  R2 = 20;
  output("R1 = ", R1);
  output("R2 = ", R2);
  output("R3 = ", R3)
}