Skip to content

Commit 38fd6b0

Browse files
authored
Merge pull request #744 from viperproject/meilers_unfold_none
New error reason for unfolding or folding with non-positive permission amount.
2 parents 07dce2b + 820db76 commit 38fd6b0

5 files changed

Lines changed: 71 additions & 11 deletions

File tree

src/main/scala/viper/silver/verifier/VerificationError.scala

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -650,6 +650,14 @@ object reasons {
650650
def withNode(offendingNode: errors.ErrorNode = this.offendingNode) = NegativePermission(offendingNode.asInstanceOf[Exp])
651651
}
652652

653+
case class NonPositivePermission(offendingNode: Exp) extends AbstractErrorReason {
654+
val id = "permission.not.positive"
655+
656+
def readableMessage = s"Fraction $offendingNode might not be positive."
657+
658+
def withNode(offendingNode: errors.ErrorNode = this.offendingNode) = NonPositivePermission(offendingNode.asInstanceOf[Exp])
659+
}
660+
653661
case class InsufficientPermission(offendingNode: LocationAccess) extends AbstractErrorReason {
654662
val id = "insufficient.permission"
655663
def readableMessage = s"There might be insufficient permission to access $offendingNode"

src/test/resources/all/issues/carbon/0125.vpr

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
1-
// Any copyright is dedicated to the Public Domain.
2-
// http://creativecommons.org/publicdomain/zero/1.0/
3-
1+
// Any copyright is dedicated to the Public Domain.
2+
// http://creativecommons.org/publicdomain/zero/1.0/
3+
44
field f: Int
55

66
predicate P(x: Ref) { acc(x.f) }
77

88
method test1(x: Ref) {
99
inhale P(x)
10-
//:: ExpectedOutput(unfold.failed:negative.permission)
10+
//:: ExpectedOutput(unfold.failed:permission.not.positive)
1111
unfold acc(P(x), -(1/2))
1212
}
1313

@@ -16,7 +16,7 @@ method test2(x: Ref) {
1616
assume p == -(1/2)
1717

1818
inhale P(x)
19-
//:: ExpectedOutput(unfold.failed:negative.permission)
19+
//:: ExpectedOutput(unfold.failed:permission.not.positive)
2020
unfold acc(P(x), p)
2121
}
2222

src/test/resources/all/issues/silver/0072.vpr

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
// Any copyright is dedicated to the Public Domain.
2-
// http://creativecommons.org/publicdomain/zero/1.0/
3-
1+
// Any copyright is dedicated to the Public Domain.
2+
// http://creativecommons.org/publicdomain/zero/1.0/
3+
44
field f: Int
55

66
predicate token(x: Ref) {
@@ -16,14 +16,14 @@ method t_plus(x: Ref)
1616
method t_minus_1(x: Ref)
1717
requires acc(x.f)
1818
{
19-
//:: ExpectedOutput(fold.failed:negative.permission)
19+
//:: ExpectedOutput(fold.failed:permission.not.positive)
2020
fold acc(token(x), (-1/1))
2121
}
2222

2323
method t_minus_2(x: Ref)
2424
requires acc(x.f)
2525
{
26-
//:: ExpectedOutput(fold.failed:negative.permission)
26+
//:: ExpectedOutput(fold.failed:permission.not.positive)
2727
fold acc(token(x), -(1/1))
2828
}
2929

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
// Any copyright is dedicated to the Public Domain.
2+
// http://creativecommons.org/publicdomain/zero/1.0/
3+
4+
5+
predicate falze()
6+
{
7+
false
8+
}
9+
10+
predicate tru()
11+
{
12+
true
13+
}
14+
15+
method test_unfold(){
16+
//:: ExpectedOutput(unfold.failed:permission.not.positive)
17+
unfold acc(falze(), none)
18+
assert false
19+
}
20+
21+
method test_unfold_unknown(p: Perm){
22+
assume p >= none
23+
//:: ExpectedOutput(unfold.failed:permission.not.positive)
24+
//:: ExpectedOutput(unfold.failed:insufficient.permission)
25+
//:: MissingOutput(unfold.failed:insufficient.permission, /Silicon/issue/34/)
26+
unfold acc(falze(), p)
27+
assert false
28+
}
29+
30+
method test_unfolding(){
31+
//:: ExpectedOutput(assert.failed:permission.not.positive)
32+
assert unfolding acc(falze(), none) in false
33+
}
34+
35+
method test_unfolding_unknown(p: Perm){
36+
assume p >= none
37+
//:: ExpectedOutput(assert.failed:permission.not.positive)
38+
//:: ExpectedOutput(assert.failed:insufficient.permission)
39+
//:: MissingOutput(assert.failed:insufficient.permission, /Silicon/issue/34/)
40+
assert unfolding acc(falze(), p) in false
41+
}
42+
43+
method test_fold(){
44+
//:: ExpectedOutput(fold.failed:permission.not.positive)
45+
fold acc(tru(), none)
46+
}
47+
48+
method test_fold_unknown(p: Perm){
49+
assume p >= none
50+
//:: ExpectedOutput(fold.failed:permission.not.positive)
51+
fold acc(tru(), p)
52+
}

src/test/resources/all/issues/silver/0522.vpr

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ method test3b(x: Ref, p: Perm) {
2727

2828
method test4(x: Ref, p: Perm) {
2929
inhale P(x)
30-
//:: ExpectedOutput(unfold.failed:negative.permission)
30+
//:: ExpectedOutput(unfold.failed:permission.not.positive)
3131
//:: ExpectedOutput(unfold.failed:insufficient.permission)
3232
//:: MissingOutput(unfold.failed:insufficient.permission, /Silicon/issue/34/)
3333
unfold acc(P(x), p)

0 commit comments

Comments
 (0)