Skip to content

Commit b4baa4b

Browse files
committed
Forbid ADT discriminators in triggers and adapt test
1 parent cbd4ef4 commit b4baa4b

File tree

3 files changed

+31
-9
lines changed

3 files changed

+31
-9
lines changed

Diff for: src/main/scala/viper/silver/plugin/standard/adt/AdtASTExtension.scala

+4-2
Original file line numberDiff line numberDiff line change
@@ -314,9 +314,11 @@ case class AdtDiscriminatorApp(name: String, rcv: Exp, typVarMap: Map[TypeVar, T
314314
}
315315
}
316316

317-
override def extensionIsValidTrigger(): Boolean = !rcv.existsDefined(Expressions.isForbiddenInTrigger)
317+
// Since a discriminator desugars to ADT_tag(rcv) == name_tag, which contains an equality,
318+
// it cannot be used anywhere inside a trigger.
319+
override def extensionIsValidTrigger(): Boolean = false
318320

319-
override def extensionIsForbiddenInTrigger(): Boolean = false
321+
override def extensionIsForbiddenInTrigger(): Boolean = true
320322
}
321323

322324
object AdtDiscriminatorApp {

Diff for: src/test/resources/all/issues/silver/0849.vpr

+2-7
Original file line numberDiff line numberDiff line change
@@ -46,14 +46,9 @@ method testDestr2(s: Set[Term], c: Term) {
4646

4747
method testDiscr(s: Set[Term], c: Term) {
4848
assume c in s
49-
assume forall i: Term :: {i.isConst} i in s ==> foo(i)
49+
// i.isConst must not be picked as a trigger, otherwise the backends may crash
50+
assume forall i: Term :: i.isConst ==> foo(i)
5051
var t: Bool := c.isConst
5152
assert foo(c)
5253
}
5354

54-
method testDiscr2(s: Set[Term], c: Term) {
55-
assume c in s
56-
assume forall i: Term :: {i.isConst} i in s ==> foo(i)
57-
//:: ExpectedOutput(assert.failed:assertion.false)
58-
assert foo(c)
59-
}

Diff for: src/test/resources/all/issues/silver/0849_2.vpr

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
// Any copyright is dedicated to the Public Domain.
2+
// http://creativecommons.org/publicdomain/zero/1.0/
3+
4+
5+
adt Term {
6+
Const(n: Int)
7+
}
8+
9+
domain theory {
10+
function foo(t: Term): Bool
11+
12+
axiom ax1 { forall n: Int ::
13+
{Const(n)} // Type checker error
14+
{foo(Const(n))} // OK
15+
foo(Const(n))
16+
}
17+
}
18+
19+
20+
method testDiscr(s: Set[Term], c: Term) {
21+
assume c in s
22+
//:: ExpectedOutput(typechecker.error)
23+
assume forall i: Term :: {i.isConst} i in s ==> foo(i)
24+
assert foo(c)
25+
}

0 commit comments

Comments
 (0)