Skip to content

Commit

Permalink
fix 815
Browse files Browse the repository at this point in the history
  • Loading branch information
jcp19 committed Feb 5, 2025
1 parent d90c9ff commit dc71130
Showing 1 changed file with 8 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
package viper.gobra.frontend.info.implementation.typing.ghost

import org.bitbucket.inkytonik.kiama.util.Messaging.{Messages, error, noMessages}
import viper.gobra.ast.frontend.{PBlock, PCodeRootWithResult, PExplicitGhostMember, PFPredicateDecl, PFunctionDecl, PFunctionSpec, PGhostMember, PIdnUse, PImplementationProof, PMember, PMPredicateDecl, PMethodDecl, PMethodImplementationProof, PParameter, PReturn, PVariadicType, PWithBody}
import viper.gobra.ast.frontend.{PBlock, PCodeRootWithResult, PExplicitGhostMember, PExpression, PFPredicateDecl, PFunctionDecl, PFunctionSpec, PGhostMember, PIdnUse, PImplementationProof, PMPredicateDecl, PMember, PMethodDecl, PMethodImplementationProof, POld, PParameter, PReturn, PVariadicType, PWithBody}
import viper.gobra.frontend.info.base.SymbolTable.{MPredicateSpec, MethodImpl, MethodSpec}
import viper.gobra.frontend.info.base.Type.{InterfaceT, Type, UnknownType}
import viper.gobra.frontend.info.implementation.TypeInfoImpl
Expand Down Expand Up @@ -64,7 +64,8 @@ trait GhostMemberTyping extends BaseTyping { this: TypeInfoImpl =>
isSingleResultArg(member) ++
isSinglePureReturnExpr(member) ++
isPurePostcondition(member.spec) ++
nonVariadicArguments(member.args)
nonVariadicArguments(member.args) ++
member.spec.posts.flatMap(hasOldExpression)
} else noMessages
}

Expand All @@ -87,6 +88,11 @@ trait GhostMemberTyping extends BaseTyping { this: TypeInfoImpl =>
}
}

private def hasOldExpression(n: PExpression): Messages = {
val hasOld = allChildren(n).exists(_.isInstanceOf[POld])
error(n, "old(_) expressions cannot occur in postconditions of pure functions.", hasOld)
}

private def isPurePostcondition(spec: PFunctionSpec): Messages = (spec.posts ++ spec.preserves) flatMap isPureExpr

private[typing] def nonVariadicArguments(args: Vector[PParameter]): Messages = args.flatMap {
Expand Down

0 comments on commit dc71130

Please sign in to comment.