Closed
Description
Compiler version
First encountered as a crash in 3.3.1 nightly, but not merged into a final release (3.3.2/3.3.3 are good)
Last good release: 3.3.1-RC1-bin-20230511-5c4e597-NIGHTLY
First bad release: 3.3.1-RC1-bin-20230513-4cb6ee6-NIGHTLY
First bad commit: 5bafff7cc96f1f31f6e77620ca509dfa55d816b4
Minimized code
sealed trait DFTypeAny
sealed trait DFTuple[T <: NonEmptyTuple] extends DFTypeAny
sealed trait DFBit extends DFTypeAny
sealed trait DFValOf[T]
type Of[T] <: DFTypeAny = T match
case DFTypeAny => T & DFTypeAny
case Product => FromProduct[T]
type JUSTVAL[T] = DFValOf[Of[T]]
type FromProduct[T <: Product] <: DFTypeAny = T match
case NonEmptyTuple => DFTuple[Tuple.Map[T, JUSTVAL]]
trait Width2[T]
object Width2:
inline given [T]: Width2[T] = new Width2[T] {}
val x = summon[Width2[Of[(DFBit, DFBit)]]]
Output
Crash in 3.3.1
Exception in thread "main" java.lang.StackOverflowError
at dotty.tools.dotc.core.TypeApplications$.tryReduce$1(TypeApplications.scala:363)
at dotty.tools.dotc.core.TypeApplications$.appliedTo$extension(TypeApplications.scala:380)
at dotty.tools.dotc.core.TypeApplications$.applyIfParameterized$extension(TypeApplications.scala:406)
at dotty.tools.dotc.core.Types$MatchType$InDisguise$.unapply(Types.scala:4962)
at dotty.tools.dotc.typer.ImplicitRunInfo$collectParts$2$.traverse(Implicits.scala:640)
at dotty.tools.dotc.core.Types$TypeTraverser.apply(Types.scala:6275)
at dotty.tools.dotc.core.Types$TypeTraverser.apply(Types.scala:6275)
at dotty.tools.dotc.core.Types$TypeAccumulator.op$proxy24$1(Types.scala:6186)
at dotty.tools.dotc.core.Types$TypeAccumulator.foldArgs$3(Types.scala:6186)
at dotty.tools.dotc.core.Types$TypeAccumulator.foldOver(Types.scala:6190)
at dotty.tools.dotc.core.Types$TypeTraverser.traverseChildren(Types.scala:6276)
at dotty.tools.dotc.typer.ImplicitRunInfo$collectParts$2$.traverse(Implicits.scala:645)
at dotty.tools.dotc.core.Types$TypeTraverser.apply(Types.scala:6275)
at dotty.tools.dotc.core.Types$TypeTraverser.apply(Types.scala:6275)
at dotty.tools.dotc.core.Types$TypeAccumulator.op$proxy24$1(Types.scala:6186)
at dotty.tools.dotc.core.Types$TypeAccumulator.foldArgs$3(Types.scala:6186)
at dotty.tools.dotc.core.Types$TypeAccumulator.foldOver(Types.scala:6190)
at dotty.tools.dotc.core.Types$TypeTraverser.traverseChildren(Types.scala:6276)
at dotty.tools.dotc.typer.ImplicitRunInfo$collectParts$2$.traverse(Implicits.scala:645)
at dotty.tools.dotc.core.Types$TypeTraverser.apply(Types.scala:6275)
at dotty.tools.dotc.core.Types$TypeTraverser.apply(Types.scala:6275)
at dotty.tools.dotc.core.Types$TypeAccumulator.op$proxy24$1(Types.scala:6186)
at dotty.tools.dotc.core.Types$TypeAccumulator.foldArgs$3(Types.scala:6186)
at dotty.tools.dotc.core.Types$TypeAccumulator.foldOver(Types.scala:6190)
at dotty.tools.dotc.core.Types$TypeTraverser.traverseChildren(Types.scala:6276)
at dotty.tools.dotc.typer.ImplicitRunInfo$collectParts$2$.traverse(Implicits.scala:645)
at dotty.tools.dotc.core.Types$TypeTraverser.apply(Types.scala:6275)
at dotty.tools.dotc.core.Types$TypeTraverser.apply(Types.scala:6275)
at dotty.tools.dotc.core.Types$TypeAccumulator.foldOver(Types.scala:6200)
at dotty.tools.dotc.core.Types$TypeTraverser.traverseChildren(Types.scala:6276)
at dotty.tools.dotc.typer.ImplicitRunInfo$collectParts$2$.traverse(Implicits.scala:636)
at dotty.tools.dotc.core.Types$TypeTraverser.apply(Types.scala:6275)
at dotty.tools.dotc.core.Types$TypeTraverser.apply(Types.scala:6275)
at dotty.tools.dotc.core.Types$TypeAccumulator.foldOver(Types.scala:6268)
at dotty.tools.dotc.core.Types$TypeAccumulator.foldOver(Types.scala:6229)
at dotty.tools.dotc.core.Types$TypeTraverser.traverseChildren(Types.scala:6276)
at dotty.tools.dotc.typer.ImplicitRunInfo$collectParts$2$.traverse(Implicits.scala:638)
at dotty.tools.dotc.core.Types$TypeTraverser.apply(Types.scala:6275)
at dotty.tools.dotc.core.Types$TypeTraverser.apply(Types.scala:6275)
at dotty.tools.dotc.core.Types$TypeAccumulator.op$proxy24$1(Types.scala:6186)
at dotty.tools.dotc.core.Types$TypeAccumulator.foldArgs$3(Types.scala:6186)
at dotty.tools.dotc.core.Types$TypeAccumulator.foldOver(Types.scala:6190)
at dotty.tools.dotc.core.Types$TypeTraverser.traverseChildren(Types.scala:6276)
at dotty.tools.dotc.typer.ImplicitRunInfo$collectParts$2$.traverse(Implicits.scala:645)
at dotty.tools.dotc.core.Types$TypeTraverser.apply(Types.scala:6275)
at dotty.tools.dotc.core.Types$TypeTraverser.apply(Types.scala:6275)
at dotty.tools.dotc.core.Types$TypeAccumulator.op$proxy24$1(Types.scala:6186)
at dotty.tools.dotc.core.Types$TypeAccumulator.foldArgs$3(Types.scala:6186)
at dotty.tools.dotc.core.Types$TypeAccumulator.foldOver(Types.scala:6190)
at dotty.tools.dotc.core.Types$TypeTraverser.traverseChildren(Types.scala:6276)
at dotty.tools.dotc.typer.ImplicitRunInfo$collectParts$2$.traverse(Implicits.scala:645)
at dotty.tools.dotc.core.Types$TypeTraverser.apply(Types.scala:6275)
at dotty.tools.dotc.core.Types$TypeTraverser.apply(Types.scala:6275)
at dotty.tools.dotc.core.Types$TypeAccumulator.foldOver(Types.scala:6268)
at dotty.tools.dotc.core.Types$TypeAccumulator.foldOver(Types.scala:6229)
at dotty.tools.dotc.core.Types$TypeTraverser.traverseChildren(Types.scala:6276)
at dotty.tools.dotc.typer.ImplicitRunInfo$collectParts$2$.traverse(Implicits.scala:638)
at dotty.tools.dotc.core.Types$TypeTraverser.apply(Types.scala:6275)
at dotty.tools.dotc.core.Types$TypeTraverser.apply(Types.scala:6275)
at dotty.tools.dotc.core.Types$TypeAccumulator.op$proxy24$1(Types.scala:6186)
at dotty.tools.dotc.core.Types$TypeAccumulator.foldArgs$3(Types.scala:6186)
at dotty.tools.dotc.core.Types$TypeAccumulator.foldOver(Types.scala:6190)
at dotty.tools.dotc.core.Types$TypeTraverser.traverseChildren(Types.scala:6276)
at dotty.tools.dotc.typer.ImplicitRunInfo$collectParts$2$.traverse(Implicits.scala:645)
at dotty.tools.dotc.core.Types$TypeTraverser.apply(Types.scala:6275)
at dotty.tools.dotc.core.Types$TypeTraverser.apply(Types.scala:6275)
at dotty.tools.dotc.core.Types$TypeAccumulator.foldOver(Types.scala:6268)
at dotty.tools.dotc.core.Types$TypeAccumulator.foldOver(Types.scala:6229)
at dotty.tools.dotc.core.Types$TypeTraverser.traverseChildren(Types.scala:6276)
at dotty.tools.dotc.typer.ImplicitRunInfo$collectParts$2$.traverse(Implicits.scala:638)
at dotty.tools.dotc.core.Types$TypeTraverser.apply(Types.scala:6275)
at dotty.tools.dotc.core.Types$TypeTraverser.apply(Types.scala:6275)
at dotty.tools.dotc.core.Types$TypeAccumulator.op$proxy24$1(Types.scala:6186)
at dotty.tools.dotc.core.Types$TypeAccumulator.foldArgs$3(Types.scala:6186)
at dotty.tools.dotc.core.Types$TypeAccumulator.foldOver(Types.scala:6190)
at dotty.tools.dotc.core.Types$TypeTraverser.traverseChildren(Types.scala:6276)
at dotty.tools.dotc.typer.ImplicitRunInfo$collectParts$2$.traverse(Implicits.scala:645)
at dotty.tools.dotc.core.Types$TypeTraverser.apply(Types.scala:6275)
at dotty.tools.dotc.core.Types$TypeTraverser.apply(Types.scala:6275)
at dotty.tools.dotc.core.Types$TypeAccumulator.op$proxy24$1(Types.scala:6186)
at dotty.tools.dotc.core.Types$TypeAccumulator.foldArgs$3(Types.scala:6186)
at dotty.tools.dotc.core.Types$TypeAccumulator.foldOver(Types.scala:6190)
at dotty.tools.dotc.core.Types$TypeTraverser.traverseChildren(Types.scala:6276)
at dotty.tools.dotc.typer.ImplicitRunInfo$collectParts$2$.traverse(Implicits.scala:645)
Error in 3.4.0:
[error] Recursion limit exceeded.
[error] Maybe there is an illegal cyclic reference?
[error] If that's not the case, you could also try to increase the stacksize using the -Xss JVM option.
[error] For the unprocessed stack trace, compile with -Yno-decode-stacktraces.
[error] A recurring operation is (inner to outer):
[error]
[error] collectParts of Tuple.Map[h, JUSTVAL]
[error] collectParts of DFTuple[Tuple.Map[h, JUSTVAL]]
[error] collectParts of scala.runtime.MatchCase[NonEmptyTuple, DFTuple[Tuple.Map[h, JUSTVAL]]]
[error] collectParts of h match {
[error] case NonEmptyTuple => DFTuple[Tuple.Map[h, JUSTVAL]]
[error] } <: DFTypeAny
[error] collectParts of FromProduct[h]
[error] collectParts of scala.runtime.MatchCase[Product, FromProduct[h]]
[error] collectParts of h match {
[error] case DFTypeAny => h & DFTypeAny
[error] case Product => FromProduct[h]
[error] } <: DFTypeAny
[error] collectParts of Of[h]
[error] collectParts of JUSTVAL[h]
[error] collectParts of JUSTVAL[h] *: Tuple.Map[t, JUSTVAL]
[error] ...
[error]
[error] collectParts of scala.runtime.MatchCase[NonEmptyTuple, DFTuple[Tuple.Map[DFBit, JUSTVAL]]]
[error] collectParts of DFBit match {
[error] case NonEmptyTuple => DFTuple[Tuple.Map[DFBit, JUSTVAL]]
[error] } <: DFTypeAny
[error] collectParts of FromProduct[DFBit]
[error] collectParts of scala.runtime.MatchCase[Product, FromProduct[DFBit]]
[error] collectParts of DFBit match {
[error] case DFTypeAny => DFBit & DFTypeAny
[error] case Product => FromProduct[DFBit]
[error] } <: DFTypeAny
[error] collectParts of Of[DFBit]
[error] collectParts of DFValOf[Of[DFBit]]
[error] collectParts of (DFValOf[Of[DFBit]], DFValOf[Of[DFBit]])
[error] collectParts of DFTuple[(DFValOf[Of[DFBit]], DFValOf[Of[DFBit]])]
[error] collectParts of Width2[DFTuple[(DFValOf[Of[DFBit]], DFValOf[Of[DFBit]])]]
[error] val x = summon[Width2[Of[(DFBit, DFBit)]]]
Expectation
No crash. No error.