Skip to content
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

3.4.x Regression summoning given with match types #19857

Closed
soronpo opened this issue Mar 3, 2024 · 1 comment · Fixed by #19867
Closed

3.4.x Regression summoning given with match types #19857

soronpo opened this issue Mar 3, 2024 · 1 comment · Fixed by #19867
Assignees
Labels
area:match-types regression This worked in a previous version but doesn't anymore stat:duplicate
Milestone

Comments

@soronpo
Copy link
Contributor

soronpo commented Mar 3, 2024

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.

@soronpo soronpo added itype:bug area:match-types regression This worked in a previous version but doesn't anymore labels Mar 3, 2024
@soronpo
Copy link
Contributor Author

soronpo commented Mar 3, 2024

Accidentally created a duplicate of #18171 trying to minimize a different bug. Oh well....

@soronpo soronpo closed this as completed Mar 3, 2024
@dwijnand dwijnand self-assigned this Mar 4, 2024
@Kordyjan Kordyjan added this to the 3.4.2 milestone Mar 28, 2024
@Kordyjan Kordyjan modified the milestones: 3.4.2, 3.5.0 May 10, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
area:match-types regression This worked in a previous version but doesn't anymore stat:duplicate
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants