summaryrefslogtreecommitdiff
path: root/Test/inline/polyInline.bpl
blob: ed404867d476ac7ca0e333751d26fbee210425c6 (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
// RUN: %boogie /typeEncoding:predicates /logPrefix:p "%s" > "%t"
// RUN: %boogie /typeEncoding:arguments /logPrefix:a "%s" >> "%t"
// RUN: %diff "%s.expect" "%t"

const C:int;
const D:bool;

function empty<alpha>() returns (alpha);

function eqC<alpha>(x:alpha) returns (bool) { x == C }
function giveEmpty<alpha>() returns (alpha) { empty() }

function {:inline true} eqC2<alpha>(x:alpha) returns (bool) { x == C }
function {:inline true} giveEmpty2<alpha>() returns (alpha) { empty() }

function eqC3<alpha>(x:alpha) returns (bool);
axiom {:inline true} (forall<alpha> x:alpha :: eqC3(x) == (x == C));

function giveEmpty3<alpha>() returns (alpha);
axiom {:inline true} (forall<alpha> :: giveEmpty3():alpha == empty());

procedure P() {
  assert eqC(C);
  assert eqC2(C);
  assert eqC3(C);
  assert eqC2(D);  // should not be provable
}

procedure Q() {
  assert giveEmpty() == empty();
  assert giveEmpty() == empty():int;
  assert giveEmpty():bool == empty();

  assert giveEmpty2() == empty();
  assert giveEmpty2() == empty():int;
  assert giveEmpty2():bool == empty();

  assert giveEmpty3() == empty();
  assert giveEmpty3() == empty():int;
  assert giveEmpty3():bool == empty();

  assert giveEmpty3() == C;     // should not be provable
}