Skip to content

Infinite recursion when printing cyclic types #91

Closed
@samuelgruetter

Description

@samuelgruetter

In this example

object infpaths {

  object a {
    trait T { t =>
      type M <: t.b.M
      type T <: a.T
      val b: t.T
    }
    val x: a.T = ???
  }

  val m1: a.x.M = ???
  val m2: a.x.b.M = m1
  val m3: a.x.b.b.M = m2

}

we run into an infinite recursion:

[info] error occurred during: TypeBounds(TypeRef(ThisType(module class scala),Nothing), TypeRef(TermRef(ThisType(module class infpaths$),a),T)): TypeBounds(TypeRef(ThisType(module class scala),Nothing), TypeRef(TermRef(ThisType(module class infpaths$),a),T)) member M
[info] exception occured while typechecking tests/pos/infpaths.scala
[error] Exception in thread "main" java.lang.StackOverflowError
[error]     at java.lang.String.getChars(String.java:826)
[error]     at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:416)
[error]     at java.lang.StringBuilder.append(StringBuilder.java:132)
[error]     at scala.collection.mutable.StringBuilder.<init>(StringBuilder.scala:47)
[error]     at scala.collection.mutable.StringBuilder.<init>(StringBuilder.scala:52)
[error]     at scala.runtime.ScalaRunTime$._toString(ScalaRunTime.scala:166)
[error]     at dotty.tools.dotc.core.Types$TermRef.toString(Types.scala:1124)
[error]     at java.lang.String.valueOf(String.java:2854)
[error]     at scala.collection.mutable.StringBuilder.append(StringBuilder.scala:198) 
[error]     at scala.collection.TraversableOnce$$anonfun$addString$1.apply(TraversableOnce.scala:345)
[error]     at scala.collection.Iterator$class.foreach(Iterator.scala:743)
[error]     at scala.collection.AbstractIterator.foreach(Iterator.scala:1174)
[error]     at scala.collection.TraversableOnce$class.addString(TraversableOnce.scala:343)
[error]     at scala.collection.AbstractIterator.addString(Iterator.scala:1174)
[error]     at scala.collection.TraversableOnce$class.mkString(TraversableOnce.scala:309)
...

Note that scalac correctly rejects this example:

<console>:12: error: cyclic aliasing or subtyping involving type M
             type M <: t.b.M
                  ^

I suspect that there might not only be a problem with printing, but also with cycle detection...

Metadata

Metadata

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