Skip to content

Commit

Permalink
Merge branch 'master' into add-test-report
Browse files Browse the repository at this point in the history
  • Loading branch information
marcoeilers authored Dec 28, 2024
2 parents 3c4b7c7 + 9b1e2cb commit 3e7b9ca
Show file tree
Hide file tree
Showing 79 changed files with 4,725 additions and 1,723 deletions.
43 changes: 0 additions & 43 deletions annotation/Terms.example.scala
Original file line number Diff line number Diff line change
Expand Up @@ -842,49 +842,6 @@ object AtLeast extends /* OptimisingBinaryArithmeticOperation with */ ((Term, Te
}
}

/*
Helper class for permissions
*/

final class Rational(n: BigInt, d: BigInt) extends Ordered[Rational] {
require(d != 0, "Denominator of Rational must not be 0.")

private val g = n.gcd(d)
val numerator: BigInt = n / g * d.signum
val denominator: BigInt = d.abs / g

def +(that: Rational): Rational = {
val newNum = this.numerator * that.denominator + that.numerator * this.denominator
val newDen = this.denominator * that.denominator
Rational(newNum, newDen)
}
def -(that: Rational): Rational = this + (-that)
def unary_- = Rational(-numerator, denominator)
def abs = Rational(numerator.abs, denominator)
def signum = Rational(numerator.signum, 1)

def *(that: Rational): Rational = Rational(this.numerator * that.numerator, this.denominator * that.denominator)
def /(that: Rational): Rational = this * that.inverse
def inverse = Rational(denominator, numerator)

def compare(that: Rational) = (this.numerator * that.denominator - that.numerator * this.denominator).signum

override def equals(obj: Any) = obj match {
case that: Rational => this.numerator == that.numerator && this.denominator == that.denominator
case _ => false
}

override lazy val toString = s"$numerator/$denominator"
}

object Rational extends ((BigInt, BigInt) => Rational) {
val zero = Rational(0, 1)
val one = Rational(1, 1)

def apply(numer: BigInt, denom: BigInt) = new Rational(numer, denom)
def unapply(r: Rational) = Some(r.numerator, r.denominator)
}

/*
* Permissions
*/
Expand Down
4 changes: 2 additions & 2 deletions project/plugins.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,5 @@
//
// Copyright (c) 2011-2019 ETH Zurich.

addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.15.0")
addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.10.0")
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "1.0.0")
addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.11.0")
2 changes: 1 addition & 1 deletion silver
Submodule silver updated 63 files
+1 −1 .github/workflows/scala.yml
+61 −0 ReleaseNotes.md
+1 −1 project/plugins.sbt
+6 −0 src/main/scala/viper/silver/ast/Ast.scala
+29 −5 src/main/scala/viper/silver/ast/Expression.scala
+6 −3 src/main/scala/viper/silver/ast/Program.scala
+5 −0 src/main/scala/viper/silver/ast/pretty/PrettyPrinter.scala
+32 −10 src/main/scala/viper/silver/ast/utility/Consistency.scala
+11 −2 src/main/scala/viper/silver/ast/utility/Expressions.scala
+1 −1 src/main/scala/viper/silver/ast/utility/ImpureAssumeRewriter.scala
+3 −3 src/main/scala/viper/silver/ast/utility/InverseFunctions.scala
+2 −1 src/main/scala/viper/silver/ast/utility/Nodes.scala
+17 −8 src/main/scala/viper/silver/ast/utility/Permissions.scala
+133 −47 src/main/scala/viper/silver/ast/utility/Simplifier.scala
+1 −1 src/main/scala/viper/silver/ast/utility/rewriter/Rewritable.scala
+1 −1 src/main/scala/viper/silver/cfg/CfgTest.scala
+1 −1 src/main/scala/viper/silver/cfg/silver/CfgGenerator.scala
+7 −0 src/main/scala/viper/silver/frontend/SilFrontEndConfig.scala
+17 −3 src/main/scala/viper/silver/frontend/SilFrontend.scala
+8 −3 src/main/scala/viper/silver/parser/FastParser.scala
+55 −4 src/main/scala/viper/silver/parser/MacroExpander.scala
+33 −2 src/main/scala/viper/silver/parser/ParseAst.scala
+2 −0 src/main/scala/viper/silver/parser/ParseAstKeyword.scala
+56 −6 src/main/scala/viper/silver/parser/Resolver.scala
+21 −14 src/main/scala/viper/silver/parser/Translator.scala
+1 −0 src/main/scala/viper/silver/plugin/standard/adt/encoding/AdtEncoder.scala
+1 −1 src/main/scala/viper/silver/plugin/standard/predicateinstance/PredicateInstancePlugin.scala
+1 −1 src/main/scala/viper/silver/plugin/standard/termination/TerminationASTExtension.scala
+1 −1 src/main/scala/viper/silver/plugin/standard/termination/TerminationPlugin.scala
+67 −4 src/main/scala/viper/silver/plugin/standard/termination/transformation/FunctionCheck.scala
+3 −2 src/main/scala/viper/silver/plugin/standard/termination/transformation/Trafo.scala
+4 −4 src/main/scala/viper/silver/testing/BackendTypeTest.scala
+48 −0 src/main/scala/viper/silver/utility/Common.scala
+31 −0 src/test/resources/all/annotation/annotationProverArgs.vpr
+38 −0 src/test/resources/all/asserting/function.vpr
+19 −0 src/test/resources/all/asserting/other-fail.vpr
+44 −0 src/test/resources/all/asserting/qp.vpr
+73 −0 src/test/resources/all/asserting/simple-fail.vpr
+22 −0 src/test/resources/all/asserting/trigger.vpr
+17 −0 src/test/resources/all/asserting/wand.vpr
+444 −0 src/test/resources/all/functions/function_precondition_perms.vpr
+8 −8 src/test/resources/all/issues/carbon/0196.vpr
+1 −1 src/test/resources/all/issues/carbon/0223.vpr
+2 −9 src/test/resources/all/issues/silicon/0030.vpr
+5 −5 src/test/resources/all/issues/silicon/0240.vpr
+1 −0 src/test/resources/all/issues/silicon/0376.vpr
+77 −0 src/test/resources/all/issues/silicon/0844.vpr
+78 −0 src/test/resources/all/issues/silicon/0845.vpr
+68 −0 src/test/resources/all/issues/silicon/0847.vpr
+25 −0 src/test/resources/all/issues/silicon/0851.vpr
+20 −0 src/test/resources/all/issues/silicon/0883.vpr
+10 −0 src/test/resources/all/issues/silicon/0886.vpr
+12 −0 src/test/resources/all/issues/silver/0786.vpr
+30 −0 src/test/resources/all/issues/silver/0803.vpr
+89 −0 src/test/resources/termination/functions/basic/permission_issues.vpr
+1 −0 src/test/resources/termination/functions/expressions/access.vpr
+0 −1 src/test/resources/wands/regression/conditionals2.vpr
+1 −1 src/test/scala/ChopperTests.scala
+4 −4 src/test/scala/ConsistencyTests.scala
+4 −4 src/test/scala/FeatureCombinationsTests.scala
+5 −5 src/test/scala/MethodDependencyTests.scala
+1 −1 src/test/scala/SimplifierTests.scala
+1 −1 src/test/scala/UtilityTests.scala
2 changes: 1 addition & 1 deletion src/main/resources/dafny_axioms/sequences.vpr
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ domain $Seq[E] {
axiom {
forall s: $Seq[E], t: $Seq[E], n: Int ::
{ Seq_take(Seq_append(s, t), n) }
n > 0 && n > Seq_length(s) ==> Seq_add(Seq_sub(n, Seq_length(s)), Seq_length(s)) == n && Seq_take(Seq_append(s, t), n) == Seq_append(s, Seq_take(t, Seq_sub(n, Seq_length(s))))
n > 0 && n > Seq_length(s) && n < Seq_length(Seq_append(s, t)) ==> Seq_add(Seq_sub(n, Seq_length(s)), Seq_length(s)) == n && Seq_take(Seq_append(s, t), n) == Seq_append(s, Seq_take(t, Seq_sub(n, Seq_length(s))))
}
axiom {
forall s: $Seq[E], t: $Seq[E], n: Int ::
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
(declare-fun MWSF_apply ($MWSF $Snap) $Snap)
6 changes: 6 additions & 0 deletions src/main/scala/Config.scala
Original file line number Diff line number Diff line change
Expand Up @@ -818,6 +818,12 @@ class Config(args: Seq[String]) extends SilFrontendConfig(args, "Silicon") {
noshort = true
)

val enableDebugging: ScallopOption[Boolean] = opt[Boolean]("enableDebugging",
descr = "Enable debugging mode",
default = Some(false),
noshort = true
)

/* Option validation (trailing file argument is validated by parent class) */

validateOpt(prover) {
Expand Down
75 changes: 66 additions & 9 deletions src/main/scala/Utils.scala
Original file line number Diff line number Diff line change
Expand Up @@ -6,20 +6,23 @@

package viper.silicon

import scala.annotation.implicitNotFound
import scala.collection.immutable.ArraySeq
import viper.silicon.state.terms._
import viper.silicon.verifier.Verifier
import viper.silver
import viper.silver.ast.utility.Triggers.TriggerGenerationWithAddAndSubtract
import viper.silver.ast.utility.rewriter.Traverse
import viper.silver.ast.SourcePNodeInfo
import viper.silver.components.StatefulComponent
import viper.silver.verifier.{VerificationError, errors}
import viper.silver.parser.{PExp, PType, PUnknown, PUnnamedTypedDeclaration}
import viper.silver.verifier.errors.Internal
import viper.silver.verifier.reasons.{FeatureUnsupported, UnexpectedNode}
import viper.silver.ast.utility.rewriter.Traverse
import viper.silicon.state.terms.{Sort, Term, Var}
import viper.silicon.verifier.Verifier
import viper.silver.ast.utility.Triggers.TriggerGenerationWithAddAndSubtract
import viper.silver.verifier.{VerificationError, errors}

import scala.annotation.implicitNotFound
import scala.collection.immutable.ArraySeq

package object utils {
def freshSnap: (Sort, Verifier) => Var = (sort, v) => v.decider.fresh(sort)
def freshSnap: (Sort, Verifier) => Var = (sort, v) => v.decider.fresh(sort, Option.when(Verifier.config.enableDebugging())(PUnknown()))
def toSf(t: Term): (Sort, Verifier) => Term = (sort, _) => t.convert(sort)

def mapReduceLeft[E](it: Iterable[E], f: E => E, op: (E, E) => E, unit: E): E =
Expand Down Expand Up @@ -131,6 +134,59 @@ package object utils {
(e0: silver.ast.Exp, e1: silver.ast.Exp) => silver.ast.Or(e0, e1)(e0.pos, e0.info),
silver.ast.FalseLit()(emptyPos))

def removeKnownToBeTrueExp(exps: List[silver.ast.Exp], terms: List[Term]): List[silver.ast.Exp] = {
exps.zip(terms).filter(t => t._2 != True).map(e => e._1)
}

def simplifyVariableName(str: String) : String = {
str.substring(0, str.lastIndexOf("@"))
}

def replaceVarsInExp(e: silver.ast.Exp, varNames: Seq[String], replacements: Seq[silver.ast.Exp]): silver.ast.Exp = {
silver.utility.Sanitizer.replaceFreeVariablesInExpression(e, varNames.zip(replacements).toMap, Set())
}

def extractPTypeFromStmt(stmt: silver.ast.Stmt): PType = {
stmt.info.getUniqueInfo[SourcePNodeInfo] match {
case Some(info) =>
val sourceNode = info.sourcePNode
sourceNode match {
case decl: PUnnamedTypedDeclaration => decl.typ
case _ => PUnknown()
}
case _ => PUnknown()
}
}

def extractPTypeFromExp(exp: silver.ast.Exp): PType = {
exp.info.getUniqueInfo[SourcePNodeInfo] match {
case Some(info) =>
val sourceNode = info.sourcePNode
sourceNode match {
case e: PExp => e.typ
case d: PUnnamedTypedDeclaration => d.typ
case _ => PUnknown()
}
case _ => PUnknown()
}
}

def buildMinExp(exps: Seq[silver.ast.Exp], typ: silver.ast.Type): silver.ast.Exp = {
exps match {
case Seq(e) => e
case Seq(e0, e1) => silver.ast.DebugPermMin(e0, e1)(e0.pos, e0.info)
case exps if exps.length > 2 => silver.ast.DebugPermMin(exps.head, buildMinExp(exps.tail, typ))(exps.head.pos, exps.head.info)
}
}

def buildQuantExp(quantifier: Quantifier, vars: Seq[silver.ast.LocalVarDecl], eBody: silver.ast.Exp, eTrigger: Seq[silver.ast.Trigger]): silver.ast.Exp = {
quantifier match {
case Forall => silver.ast.Forall(vars, eTrigger, eBody)(eBody.pos, eBody.info, eBody.errT)
case Exists => silver.ast.Exists(vars, eTrigger, eBody)(eBody.pos, eBody.info, eBody.errT)
}
}


/** Note: be aware of Silver issue #95!*/
def rewriteRangeContains(program: silver.ast.Program): silver.ast.Program =
program.transform({
Expand Down Expand Up @@ -211,7 +267,7 @@ package object utils {
def toUnambiguousShortString(resource: silver.ast.Resource): String = {
resource match {
case l: silver.ast.Location => l.name
case m: silver.ast.MagicWand => m.toString()
case m: silver.ast.MagicWand => m.toString
case m@silver.ast.MagicWandOp => s"${silver.ast.MagicWandOp.op}@${sourceLineColumn(m)}"
}
}
Expand All @@ -222,6 +278,7 @@ package object utils {
case class ViperEmbedding(embeddedSort: Sort) extends silver.ast.ExtensionType {
def substitute(typVarsMap: Predef.Map[silver.ast.TypeVar, silver.ast.Type]): silver.ast.Type = this
def isConcrete: Boolean = true
override def toString: String = s"ViperEmbedding(sorts.$embeddedSort)"
}
}

Expand Down
Loading

0 comments on commit 3e7b9ca

Please sign in to comment.