Skip to content

Option-less extractors result in "Lookup failure" exceptions #1696

@Ant-28

Description

@Ant-28

Versions

0.9.9.2

Problem

Extractor patterns that do not return Option[T] result in

MWE

//> using jar stainless-library.jar
//> using jar stainless-library-sources.jar
import stainless.annotation.ignore

case class Singleton(x: BigInt)

def unapply(u: Singleton): (BigInt) = {
    u match
        case Singleton(x) => (x)             
}

def testValidate(u: Singleton): Singleton = {
    require(u == Singleton(2))
    u match
        case Singleton(x) => Singleton(x + 1) 
}.ensuring(res => res == Singleton(3))

@ignore 
@main def main() = 
    println(testValidate(Singleton(2)))

The inclusion of main has no effect on the result. It should be noted that changing the signature of unapply to Option[BigInt] results in a successful verification pipeline.

//> using jar stainless-library.jar
//> using jar stainless-library-sources.jar
import stainless.annotation.ignore
import stainless.lang.*

case class Singleton(x: BigInt)

def unapply(u: Singleton): Option[BigInt] = {
    u match
        case Singleton(x) => Some(x)        
    
}

// rest unchanged

Stacktrace

inox.ast.Definitions$FunctionLookupException: Lookup failed for function with symbol `<none>$0`
	at inox.ast.Definitions$FunctionLookupException$.apply(Definitions.scala:32)
	at inox.ast.Definitions$AbstractSymbols.getFunction$$anonfun$1(Definitions.scala:194)
	at scala.Option.getOrElse(Option.scala:201)
	at inox.ast.Definitions$AbstractSymbols.getFunction(Definitions.scala:194)
	at inox.ast.Definitions$AbstractSymbols.getFunction$(Definitions.scala:119)
	at stainless.extraction.oo.ClassSymbols$ClassSymbols.getFunction(ClassSymbols.scala:18)
	at inox.ast.CallGraph.transitiveCallees$$anonfun$1(CallGraph.scala:112)
	at scala.collection.StrictOptimizedIterableOps.map(StrictOptimizedIterableOps.scala:100)
	at scala.collection.StrictOptimizedIterableOps.map$(StrictOptimizedIterableOps.scala:87)
	at scala.collection.immutable.Set$Set1.map(Set.scala:165)
	at inox.ast.CallGraph.transitiveCallees(CallGraph.scala:112)
	at inox.ast.CallGraph.transitiveCallees$(CallGraph.scala:9)
	at stainless.extraction.oo.ClassSymbols$ClassSymbols.transitiveCallees(ClassSymbols.scala:18)
	at stainless.extraction.imperative.EffectsAnalyzer$EffectsAnalysis.$init$$$anonfun$2(EffectsAnalyzer.scala:106)
	at scala.collection.IterableOnceOps.foldLeft(IterableOnce.scala:727)
	at scala.collection.IterableOnceOps.foldLeft$(IterableOnce.scala:721)
	at scala.collection.AbstractIterable.foldLeft(Iterable.scala:935)
	at stainless.extraction.imperative.EffectsAnalyzer$EffectsAnalysis.$init$(EffectsAnalyzer.scala:104)
	at stainless.extraction.imperative.AntiAliasing$SymbolsAnalysis.<init>(AntiAliasing.scala:44)
	at stainless.extraction.imperative.AntiAliasing$SymbolsAnalysis$.apply(AntiAliasing.scala:44)
	at stainless.extraction.imperative.AntiAliasing.getContext(AntiAliasing.scala:83)
	at stainless.extraction.imperative.AntiAliasing.getContext(AntiAliasing.scala:83)
	at stainless.extraction.CachingPhase.extract(ExtractionPipeline.scala:125)
	at stainless.extraction.CachingPhase.extract$(ExtractionPipeline.scala:105)
	at stainless.extraction.imperative.AntiAliasing.extract(AntiAliasing.scala:11)
	at stainless.extraction.utils.NamedPipeline.extract$$anonfun$1$$anonfun$1(NamedPipeline.scala:141)
	at scala.util.Try$.apply(Try.scala:217)
	at inox.utils.TimerStorage.runAndGetTime(Timer.scala:84)
	at inox.utils.TimerStorage.run(Timer.scala:78)
	at stainless.extraction.utils.NamedPipeline.extract$$anonfun$1(NamedPipeline.scala:141)
	at stainless.extraction.utils.DebugSymbols.debug(NamedPipeline.scala:64)
	at stainless.extraction.utils.DebugSymbols.debug$(NamedPipeline.scala:29)
	at stainless.extraction.utils.NamedPipeline.debug(NamedPipeline.scala:127)
	at stainless.extraction.utils.NamedPipeline.extract(NamedPipeline.scala:142)
	at stainless.extraction.ExtractionPipeline$AndThenImpl$1.extract(ExtractionPipeline.scala:47)
	at stainless.extraction.ExtractionPipeline$AndThenImpl$1.extract(ExtractionPipeline.scala:48)
	at stainless.extraction.ExtractionPipeline$AndThenImpl$1.extract(ExtractionPipeline.scala:48)
	at stainless.extraction.ExtractionPipeline$AndThenImpl$1.extract(ExtractionPipeline.scala:47)
	at stainless.extraction.ExtractionPipeline$AndThenImpl$1.extract(ExtractionPipeline.scala:47)
	at stainless.extraction.ExtractionPipeline$AndThenImpl$1.extract(ExtractionPipeline.scala:47)
	at stainless.extraction.ExtractionPipeline$AndThenImpl$1.extract(ExtractionPipeline.scala:47)
	at stainless.extraction.ExtractionPipeline$AndThenImpl$1.extract(ExtractionPipeline.scala:47)
	at stainless.extraction.ExtractionPipeline$AndThenImpl$1.extract(ExtractionPipeline.scala:47)
	at stainless.extraction.ExtractionPipeline$AndThenImpl$1.extract(ExtractionPipeline.scala:47)
	at stainless.extraction.ExtractionPipeline$AndThenImpl$1.extract(ExtractionPipeline.scala:47)
	at stainless.ComponentRun.extract(Component.scala:75)
	at stainless.ComponentRun.extract$(Component.scala:35)
	at stainless.verification.VerificationRun.extract(VerificationComponent.scala:48)
	at stainless.ComponentRun.apply(Component.scala:85)
	at stainless.ComponentRun.apply$(Component.scala:35)
	at stainless.verification.VerificationRun.apply(VerificationComponent.scala:48)
	at stainless.frontend.BatchedCallBack.$anonfun$3(BatchedCallBack.scala:116)
	at scala.collection.immutable.List.map(List.scala:247)
	at scala.collection.immutable.List.map(List.scala:79)
	at stainless.frontend.BatchedCallBack.endExtractions(BatchedCallBack.scala:114)
	at stainless.frontend.ThreadedFrontend$$anon$1.run(ThreadedFrontend.scala:36)
	at java.base/java.lang.Thread.run(Thread.java:1583)

Result from scala-cli

scala-cli test.scala
Compiling project (Scala 3.7.4, JVM (17))
Compiled project (Scala 3.7.4, JVM (17))
Singleton(3)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions