Skip to content

Stackoverflow when testing provablyDisjoint #9016

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
odersky opened this issue May 21, 2020 · 1 comment
Closed

Stackoverflow when testing provablyDisjoint #9016

odersky opened this issue May 21, 2020 · 1 comment

Comments

@odersky
Copy link
Contributor

odersky commented May 21, 2020

Minimized example

Change tests/run/enum-Trees.scala by adding a trait P to each case:

trait P
enum Tree[T] {
  case True                 extends Tree[Boolean], P
  case False                extends Tree[Boolean], P
  case Zero                 extends Tree[Int], P
  case Succ(n: Tree[Int])   extends Tree[Int], P
  case Pred(n: Tree[Int])   extends Tree[Int], P
  case IsZero(n: Tree[Int]) extends Tree[Boolean], P
  case If(cond: Tree[Boolean], thenp: Tree[T], elsep: Tree[T])
                            extends Tree[T], P
}

object Test {
  import Tree._

  def eval[T](e: Tree[T]): T = e match {
    case True => true
    case False => false
    case Zero => 0
    case Succ(f) => eval(f) + 1
    case Pred(f) => eval(f) - 1
    case IsZero(f) => eval(f) == 0
    case If(cond, thenp, elsep) => if (eval(cond)) eval(thenp) else eval(elsep)
  }

  val data = If(IsZero(Pred(Succ(Zero))), Succ(Succ(Zero)), Pred(Pred(Zero)))

  def main(args: Array[String]) = {
    println(s"$data --> ${eval(data)}")
  }
}

Output

java.lang.StackOverflowError while compiling enum-Tree.scala
Exception in thread "main" java.lang.StackOverflowError
	at scala.util.control.NonFatal$.apply(NonFatal.scala:41)
	at scala.util.control.NonFatal$.unapply(NonFatal.scala:47)
	at dotty.tools.dotc.printing.Formatting$StringFormatter.showArg(Formatting.scala:31)
	at dotty.tools.dotc.printing.Formatting$StringFormatter.treatArg(Formatting.scala:49)
	at dotty.tools.dotc.printing.Formatting$StringFormatter.$anonfun$2(Formatting.scala:62)
	at scala.collection.LazyZip2$$anon$1$$anon$2.next(LazyZipOps.scala:42)
	at scala.collection.mutable.Growable.addAll(Growable.scala:62)
	at scala.collection.mutable.Growable.addAll$(Growable.scala:59)
	at scala.collection.mutable.ArrayBuilder.addAll(ArrayBuilder.scala:69)
	at scala.collection.IterableOnceOps.toArray(IterableOnce.scala:1265)
	at scala.collection.IterableOnceOps.toArray$(IterableOnce.scala:1259)
	at scala.collection.AbstractIterable.toArray(Iterable.scala:921)
	at scala.Array$.from(Array.scala:59)
	at scala.collection.immutable.ArraySeq$.from(ArraySeq.scala:188)
	at scala.collection.immutable.ArraySeq$.from(ArraySeq.scala:179)
	at scala.collection.ClassTagIterableFactory$AnyIterableDelegate.from(Factory.scala:656)
	at scala.collection.BuildFromLowPriority2$$anon$11.fromSpecific(BuildFrom.scala:113)
	at scala.collection.BuildFromLowPriority2$$anon$11.fromSpecific(BuildFrom.scala:110)
	at scala.collection.LazyZip2.map(LazyZipOps.scala:37)
	at dotty.tools.dotc.printing.Formatting$StringFormatter.assemble(Formatting.scala:62)
	at dotty.tools.dotc.core.Decorators$StringInterpolators$.i$extension(Decorators.scala:215)
	at dotty.tools.dotc.core.TypeComparer.provablyDisjoint(TypeComparer.scala:2332)
	at dotty.tools.dotc.core.TypeComparer.provablyDisjoint$$anonfun$1(TypeComparer.scala:2367)
	at scala.collection.immutable.List.forall(List.scala:358)
	at dotty.tools.dotc.core.TypeComparer.provablyDisjoint(TypeComparer.scala:2367)
	at dotty.tools.dotc.core.TypeComparer.provablyDisjoint(TypeComparer.scala:2426)
	at dotty.tools.dotc.core.TypeComparer.provablyDisjoint(TypeComparer.scala:2422)
	at dotty.tools.dotc.core.TypeComparer.provablyDisjoint(TypeComparer.scala:2426)
	at dotty.tools.dotc.core.TypeComparer.provablyDisjoint$$anonfun$1(TypeComparer.scala:2367)
	at scala.collection.immutable.List.forall(List.scala:358)
	at dotty.tools.dotc.core.TypeComparer.provablyDisjoint(TypeComparer.scala:2367)
	at dotty.tools.dotc.core.TypeComparer.provablyDisjoint(TypeComparer.scala:2426)
	at dotty.tools.dotc.core.TypeComparer.provablyDisjoint(TypeComparer.scala:2422)
	at dotty.tools.dotc.core.TypeComparer.provablyDisjoint(TypeComparer.scala:2426)
	at dotty.tools.dotc.core.TypeComparer.provablyDisjoint$$anonfun$1(TypeComparer.scala:2367)
	at scala.collection.immutable.List.forall(List.scala:358)
	at dotty.tools.dotc.core.TypeComparer.provablyDisjoint(TypeComparer.scala:2367)
	at dotty.tools.dotc.core.TypeComparer.provablyDisjoint(TypeComparer.scala:2426)
	at dotty.tools.dotc.core.TypeComparer.provablyDisjoint(TypeComparer.scala:2422)
	at dotty.tools.dotc.core.TypeComparer.provablyDisjoint(TypeComparer.scala:2426)
	at dotty.tools.dotc.core.TypeComparer.provablyDisjoint$$anonfun$1(TypeComparer.scala:2367)

Expectation

Should compile as before

@soronpo
Copy link
Contributor

soronpo commented May 21, 2020

This is such a beautiful example use case of enum!

OlivierBlanvillain added a commit that referenced this issue May 22, 2020
Fix #9016: Fix stackoverflows in provablyDisjoint
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants