Skip to content

3.4.x Regression summoning given with match types #19857

Closed
@soronpo

Description

@soronpo

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.

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions