summaryrefslogtreecommitdiff
path: root/Test/linear/typecheck.bpl
blob: c3c294c9293d5fe920a8a9335413dd9696dd2336 (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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
// RUN: %boogie -noinfer -typeEncoding:m -useArrayTheory  "%s" > "%t"
// RUN: %diff "%s.expect" "%t"
type X;

procedure A()
{
    var {:linear "A"} a: X;
    var {:linear "A"} b: int;
}

procedure B()
{
    var {:linear "B"} a: X;
    var {:linear "B"} b: [X]bool;
}

procedure C()
{
    var {:linear "C"} a: X;
    var {:linear "C"} c: [X]int;
}

function f(X): X;

procedure {:yields} {:layer 1} D()
{
    var {:linear "D"} a: X;
    var {:linear "D"} x: X;
    var {:linear "D"} b: [X]bool;
    var c: X;
    var {:linear "D2"} d: X;

    b[a] := true;

    a := f(a);

    a := c;

    c := a;

    a := d;

    a := a;

    a, x := x, a;

    a, x := x, x;

    call a, x := E(a, x);

    call a, x := E(a, a);

    call a, x := E(a, f(a));

    call a, x := E(a, d);

    call d, x := E(a, x);

    call a, x := E(c, x);

    call c, x := E(a, x);

    yield;
    par a := F(a) | x := F(a);
    yield;
}

procedure {:yields} {:layer 1} E({:linear_in "D"} a: X, {:linear_in "D"} b: X) returns ({:linear "D"} c: X, {:linear "D"} d: X)
{
    yield;
    c := a;
    yield;
}

procedure {:yields} {:layer 0} F({:linear_in "D"} a: X) returns ({:linear "D"} c: X);

var {:linear "x"} g:int;

procedure G(i:int) returns({:linear "x"} r:int)
{
  r := g;
}

procedure H(i:int) returns({:linear "x"} r:int)
modifies g;
{
  g := r;
}

procedure {:yields} {:layer 0} I({:linear_in ""} x:int) returns({:linear ""} x':int)
{
  yield;
  x' := x;
  yield;
}

procedure {:yields} {:layer 0} J()
{
  yield;
}

procedure {:yields} {:layer 1} P1({:linear_in ""} x:int) returns({:linear ""} x':int)
{
  yield;
  par x' := I(x) | J();
  yield;
  call x' := I(x');
  yield;
}

procedure {:yields} {:layer 1} P2({:linear_in ""} x:int) returns({:linear ""} x':int)
{
  yield;
  call x' := I(x);
  yield;
  par x' := I(x') | J();
  yield;
}