Skip to content

Stack overflow when writing analysis #1529

@tgodzik

Description

@tgodzik

steps

Try to compile:

trait TypeBound {

  type Min
  type Max >: Min
}

object TypeBound {

  type Pinpoint = TypeBound { type Max = Min }
}

object HasPoly1 {

  trait Poly1[B <: TypeBound] {

    type Refined[Sub <: B]

    def refine[Sub <: B](sub: Sub): Refined[Sub]
  }

  object Poly1 {

    type Concrete = Poly1[? <: TypeBound.Pinpoint] // can only refine using a concrete type, not a type bound

    case class Example1() extends Poly1[TypeBound.Pinpoint] {

      case class Refined[Sub <: TypeBound.Pinpoint](sub: Sub) {

        final val fn: sub.Max => Seq[sub.Max] = { v =>
          Seq(v)
        }
      }

      def refine[Sub <: TypeBound.Pinpoint](sub: Sub): Refined[Sub] = Refined[Sub](sub)
    }
  }
}

under newest Scala 3.

Cause: java.lang.StackOverflowError
	at sbt.internal.inc.binary.converters.ProtobufWriters.toStructure(ProtobufWriters.scala:377)
	at sbt.internal.inc.binary.converters.ProtobufWriters.toType(ProtobufWriters.scala:444)
	at sbt.internal.inc.binary.converters.ProtobufWriters.toProjection$1(ProtobufWriters.scala:393)
	at sbt.internal.inc.binary.converters.ProtobufWriters.toType(ProtobufWriters.scala:449)
	at sbt.internal.inc.binary.converters.ProtobufWriters.toTypeAlias$1(ProtobufWriters.scala:553)
	at sbt.internal.inc.binary.converters.ProtobufWriters.toClassDefinition(ProtobufWriters.scala:580)
	at sbt.internal.inc.binary.converters.ProtobufWriters.$anonfun$toStructure$1(ProtobufWriters.scala:377)
	at scala.collection.ArrayOps$.foreach$extension(ArrayOps.scala:1323)
	at sbt.internal.inc.binary.converters.ProtobufWriters.toStructure(ProtobufWriters.scala:377)
	at sbt.internal.inc.binary.converters.ProtobufWriters.toType(ProtobufWriters.scala:444)
	at sbt.internal.inc.binary.converters.ProtobufWriters.$anonfun$toStructure$3(ProtobufWriters.scala:379)
	at scala.collection.ArrayOps$.foreach$extension(ArrayOps.scala:1323)
	at sbt.internal.inc.binary.converters.ProtobufWriters.toStructure(ProtobufWriters.scala:379)
	at sbt.internal.inc.binary.converters.ProtobufWriters.toType(ProtobufWriters.scala:444)
	at sbt.internal.inc.binary.converters.ProtobufWriters.toProjection$1(ProtobufWriters.scala:393)
	at sbt.internal.inc.binary.converters.ProtobufWriters.toType(ProtobufWriters.scala:449)
	at sbt.internal.inc.binary.converters.ProtobufWriters.toTypeAlias$1(ProtobufWriters.scala:553)
	at sbt.internal.inc.binary.converters.ProtobufWriters.toClassDefinition(ProtobufWriters.scala:580)
	at sbt.internal.inc.binary.converters.ProtobufWriters.$anonfun$toStructure$1(ProtobufWriters.scala:377)
	at scala.collection.ArrayOps$.foreach$extension(ArrayOps.scala:1323)
	at sbt.internal.inc.binary.converters.ProtobufWriters.toStructure(ProtobufWriters.scala:377)
	at sbt.internal.inc.binary.converters.ProtobufWriters.toType(ProtobufWriters.scala:444)
	at sbt.internal.inc.binary.converters.ProtobufWriters.$anonfun$toStructure$3(ProtobufWriters.scala:379)
	at scala.collection.ArrayOps$.foreach$extension(ArrayOps.scala:1323)
	at sbt.internal.inc.binary.converters.ProtobufWriters.toStructure(ProtobufWriters.scala:379)
	at sbt.internal.inc.binary.converters.ProtobufWriters.toType(ProtobufWriters.scala:444)
	at sbt.internal.inc.binary.converters.ProtobufWriters.toProjection$1(ProtobufWriters.scala:393)
	at sbt.internal.inc.binary.converters.ProtobufWriters.toType(ProtobufWriters.scala:449)
	at sbt.internal.inc.binary.converters.ProtobufWriters.toTypeAlias$1(ProtobufWriters.scala:553)
	at sbt.internal.inc.binary.converters.ProtobufWriters.toClassDefinition(ProtobufWriters.scala:580)
	at sbt.internal.inc.binary.converters.ProtobufWriters.$anonfun$toStructure$1(ProtobufWriters.scala:377)
	at scala.collection.ArrayOps$.foreach$extension(ArrayOps.scala:1323)
	at sbt.internal.inc.binary.converters.ProtobufWriters.toStructure(ProtobufWriters.scala:377)
	at sbt.internal.inc.binary.converters.ProtobufWriters.toType(ProtobufWriters.scala:444)
	at sbt.internal.inc.binary.converters.ProtobufWriters.$anonfun$toStructure$3(ProtobufWriters.scala:379)
	at scala.collection.ArrayOps$.foreach$extension(ArrayOps.scala:1323)
	at sbt.internal.inc.binary.converters.ProtobufWriters.toStructure(ProtobufWriters.scala:379)
	at sbt.internal.inc.binary.converters.ProtobufWriters.toType(ProtobufWriters.scala:444)
	at sbt.internal.inc.binary.converters.ProtobufWriters.toProjection$1(ProtobufWriters.scala:393)
	at sbt.internal.inc.binary.converters.ProtobufWriters.toType(ProtobufWriters.scala:449)
	at sbt.internal.inc.binary.converters.ProtobufWriters.toTypeAlias$1(ProtobufWriters.scala:553)
	at sbt.internal.inc.binary.converters.ProtobufWriters.toClassDefinition(ProtobufWriters.scala:580)
	at sbt.internal.inc.binary.converters.ProtobufWriters.$anonfun$toStructure$1(ProtobufWriters.scala:377)
	at scala.collection.ArrayOps$.foreach$extension(ArrayOps.scala:1323)
	at sbt.internal.inc.binary.converters.ProtobufWriters.toStructure(ProtobufWriters.scala:377)
	at sbt.internal.inc.binary.converters.ProtobufWriters.toType(ProtobufWriters.scala:444)
	at sbt.internal.inc.binary.converters.ProtobufWriters.$anonfun$toStructure$3(ProtobufWriters.scala:379)
	at scala.collection.ArrayOps$.foreach$extension(ArrayOps.scala:1323)
	at sbt.internal.inc.binary.converters.ProtobufWriters.toStructure(ProtobufWriters.scala:379)
	at sbt.internal.inc.binary.converters.ProtobufWriters.toType(ProtobufWriters.scala:444)
	at sbt.internal.inc.binary.converters.ProtobufWriters.toProjection$1(ProtobufWriters.scala:393)
	at sbt.internal.inc.binary.converters.ProtobufWriters.toType(ProtobufWriters.scala:449)
	at sbt.internal.inc.binary.converters.ProtobufWriters.toTypeAlias$1(ProtobufWriters.scala:553)
	at sbt.internal.inc.binary.converters.ProtobufWriters.toClassDefinition(ProtobufWriters.scala:580)
	at sbt.internal.inc.binary.converters.ProtobufWriters.$anonfun$toStructure$1(ProtobufWriters.scala:377)
..

problem

Looks like an inifinite loop.

expectation

It should not fail to write analysis

notes

Raised in scala/scala3#22026

Anyone has an idea what can be fixed here? I also checked on sbt 2 and the same issue happened

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