summaryrefslogtreecommitdiff
path: root/Test/test2/FreeCall.bpl
blob: 06eb737e4e4961587225d677a6717df0c42b8617 (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
// Test the implementation of free calls. These calls don't check the preconditions of the
// called procedure in the caller.


procedure Uncallable(i: int)
  requires 0 <= i;
  free requires true;
  requires false;
{

}

procedure UncallableReturn(i: int) returns (b: bool)
  requires 0 <= i;
  free requires true;
  requires false;
{
    b := true;
}

function T(b: bool) : bool
{
    b == true
}

procedure TestCallForall(b: bool)
  requires T(b);
  free requires true;
  ensures T(b);
{

}


procedure NormalCall0()
{
    call Uncallable(0); // error: precondition violation
}

procedure NormalCall1()
{
    call Uncallable(-1); // error: precondition violation
}

procedure FreeCall0()
{
    free call Uncallable(0);
}

procedure FreeCall1()
{
    free call Uncallable(-1);
}

procedure NormalCall2()
{
    var b: bool;

    call b := UncallableReturn(0); // error: precondition violation
}

procedure NormalCall3()
{
    var b: bool;

    call b := UncallableReturn(-1); // error: precondition violation
}

procedure FreeCall3()
{
    var b: bool;

    free call b := UncallableReturn(0);
}

procedure FreeCall4()
{
    var b: bool;

    free call b := UncallableReturn(-1);
}

procedure NormalCall5()
{
    call forall TestCallForall(*);
    assert T(true);
    assert T(false); // error
}

procedure FreeCall5()
{
    free call forall TestCallForall(*);
    assert T(true);
    assert T(false);
    assert false;
}