Skip to content

Commit 73ac16a

Browse files
authored
Merge pull request #695 from viperproject/meilers_labelled_old_trigger
Labelled old in triggers
2 parents dc8f0c9 + 66e8cc7 commit 73ac16a

2 files changed

Lines changed: 71 additions & 0 deletions

File tree

src/main/scala/viper/silver/ast/utility/Consistency.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,7 @@ object Consistency {
229229
def validTrigger(e: Exp, program: Program): Boolean = {
230230
e match {
231231
case Old(nested) => validTrigger(nested, program) // case corresponds to OldTrigger node
232+
case LabelledOld(nested, _) => validTrigger(nested, program)
232233
case wand: MagicWand => wand.subexpressionsToEvaluate(program).forall(e => !e.existsDefined {case _: ForbiddenInTrigger => })
233234
case _ : PossibleTrigger | _: FieldAccess | _: PredicateAccess => !e.existsDefined { case _: ForbiddenInTrigger => }
234235
case _ => false
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
// Any copyright is dedicated to the Public Domain.
2+
// http://creativecommons.org/publicdomain/zero/1.0/
3+
4+
field f: Int
5+
6+
function lookup(r: Ref, i: Int): Int
7+
requires acc(r.f)
8+
9+
10+
function lookup2(r: Ref, i: Int): Int
11+
requires acc(r.f)
12+
13+
method main(r1: Ref, r2: Ref)
14+
requires acc(r1.f) && acc(r2.f)
15+
{
16+
assume r1.f == 1
17+
exhale acc(r1.f) && acc(r2.f)
18+
inhale acc(r1.f) && acc(r2.f)
19+
assume r1.f == 3
20+
var s: Set[Ref]
21+
s := Set(r1, r2)
22+
assume lookup(r1, 5) > 3
23+
label before
24+
exhale acc(r1.f) && acc(r2.f)
25+
inhale acc(r1.f) && acc(r2.f)
26+
assume r1.f == 4
27+
assume forall i: Int :: { old[before](lookup(r1, i)) } lookup2(r1, i) == old[before](lookup(r1, i))
28+
29+
assert lookup2(r1, 5) > 2
30+
}
31+
32+
method main_fail_1(r1: Ref, r2: Ref)
33+
requires acc(r1.f) && acc(r2.f)
34+
{
35+
assume r1.f == 1
36+
exhale acc(r1.f) && acc(r2.f)
37+
inhale acc(r1.f) && acc(r2.f)
38+
assume r1.f == 3
39+
var s: Set[Ref]
40+
s := Set(r1, r2)
41+
assume lookup(r1, 5) > 3
42+
label before
43+
exhale acc(r1.f) && acc(r2.f)
44+
inhale acc(r1.f) && acc(r2.f)
45+
assume r1.f == 4
46+
assume forall i: Int :: { lookup(r1, i) } lookup2(r1, i) == old[before](lookup(r1, i))
47+
48+
//:: ExpectedOutput(assert.failed:assertion.false)
49+
assert lookup2(r1, 5) > 2
50+
}
51+
52+
method main_fail_2(r1: Ref, r2: Ref)
53+
requires acc(r1.f) && acc(r2.f)
54+
{
55+
assume r1.f == 1
56+
exhale acc(r1.f) && acc(r2.f)
57+
inhale acc(r1.f) && acc(r2.f)
58+
assume r1.f == 3
59+
var s: Set[Ref]
60+
s := Set(r1, r2)
61+
assume lookup(r1, 5) > 3
62+
label before
63+
exhale acc(r1.f) && acc(r2.f)
64+
inhale acc(r1.f) && acc(r2.f)
65+
assume r1.f == 4
66+
assume forall i: Int :: { old(lookup(r1, i)) } lookup2(r1, i) == old[before](lookup(r1, i))
67+
68+
//:: ExpectedOutput(assert.failed:assertion.false)
69+
assert lookup2(r1, 5) > 2
70+
}

0 commit comments

Comments
 (0)