diff --git a/src/main/scala/leon/xlang/ImperativeCodeElimination.scala b/src/main/scala/leon/xlang/ImperativeCodeElimination.scala index 9d000489f84b438260abacda8a42ad3965150237..8f26df8f410e614dc58ce83d88737d40fa42d50f 100644 --- a/src/main/scala/leon/xlang/ImperativeCodeElimination.scala +++ b/src/main/scala/leon/xlang/ImperativeCodeElimination.scala @@ -252,6 +252,16 @@ object ImperativeCodeElimination extends LeonPhase[Program, (Program, Set[FunDef } (i, scope, Map()) + case And(args) => { + val ifExpr = args.reduceRight((el, acc) => IfExpr(el, acc, BooleanLiteral(false))) + toFunction(ifExpr) + } + + case Or(args) => { + val ifExpr = args.reduceRight((el, acc) => IfExpr(el, BooleanLiteral(true), acc)) + toFunction(ifExpr) + } + case n @ NAryOperator(Seq(), recons) => (n, (body: Expr) => body, Map()) case n @ NAryOperator(args, recons) => { val (recArgs, scope, fun) = args.foldRight((Seq[Expr](), (body: Expr) => body, Map[Identifier, Identifier]()))((arg, acc) => { diff --git a/src/test/resources/regression/verification/xlang/valid/ShortCircuit.scala b/src/test/resources/regression/verification/xlang/valid/ShortCircuit.scala new file mode 100644 index 0000000000000000000000000000000000000000..a35daf11ab00e9d1ab807aa215b981f5e52b9363 --- /dev/null +++ b/src/test/resources/regression/verification/xlang/valid/ShortCircuit.scala @@ -0,0 +1,19 @@ +import leon.lang._ +import leon.collection._ +import leon._ + +object ShortCircuit { + + def negate(a: Boolean) = { + var b = true + a && { b = false; true } + b + } ensuring { res => res != a } + + def negateOr(a: Boolean) = { + var b = false + a || { b = true; true } + b + } ensuring { res => res != a } + +}