scalacenter / tasty-query

Apache License 2.0
51 stars 11 forks source link

Infinite loop in resolution of symbol whose declared type is a recursive match type #401

Closed adpi2 closed 10 months ago

adpi2 commented 10 months ago
package example

type Rec[A <: Tuple] <: Tuple = A match
  case hd *: tl => hd *: Rec[tl]
  case EmptyTuple => EmptyTuple

object Rec:
  inline def rec[A <: Tuple](a: A): Rec[A] = 
    inline a match
      case b: (hd *: tl) => b.head *: rec(b.tail)
      case _: EmptyTuple => EmptyTuple

trait Codec[A]:
  def map[B](x: A => B): Codec[B]

object Test:
  inline def rec[A <: Tuple](c: Codec[A]): Codec[Rec[A]] =
    c.map(x => Rec.rec(x)) // line 18

If I resolve the symbol of tree Rec.rec on line 18, I got a StackOverflowError:

java.lang.StackOverflowError: null
    at tastyquery.TypeMaps$TypeMap.mapOver(TypeMaps.scala:110)
    at tastyquery.TypeMaps$NormalizingTypeMap.mapOver(TypeMaps.scala:209)
    at tastyquery.TypeMaps$TypeMap.mapOver(TypeMaps.scala:90)
    at tastyquery.TypeOps$AsSeenFromMap.transform(TypeOps.scala:72)
    at tastyquery.TypeMaps$TypeMap.apply(TypeMaps.scala:32)
    at tastyquery.TypeMaps$TypeMap.mapOver(TypeMaps.scala:173)
    at tastyquery.TypeMaps$TypeMap.mapOver(TypeMaps.scala:91)
    at tastyquery.TypeOps$AsSeenFromMap.transform(TypeOps.scala:72)
    at tastyquery.TypeMaps$TypeMap.apply(TypeMaps.scala:32)
    at tastyquery.TypeMaps$TypeMap.$anonfun$1(TypeMaps.scala:74)
    at scala.collection.immutable.List.mapConserve(List.scala:472)
    at tastyquery.TypeMaps$TypeMap.mapOverLambda(TypeMaps.scala:74)
    at tastyquery.TypeMaps$TypeMap.mapOver(TypeMaps.scala:124)
    at tastyquery.TypeMaps$NormalizingTypeMap.mapOver(TypeMaps.scala:209)
    at tastyquery.TypeMaps$TypeMap.mapOver(TypeMaps.scala:90)
    at tastyquery.TypeOps$AsSeenFromMap.transform(TypeOps.scala:72)
    at tastyquery.TypeMaps$TypeMap.apply(TypeMaps.scala:32)
    at tastyquery.TypeOps$.asSeenFrom(TypeOps.scala:13)
    at tastyquery.Types$Type.asSeenFrom(Types.scala:482)
    at tastyquery.Symbols$TypeSymbolWithBounds.default$1$$anonfun$1(Symbols.scala:736)
    at tastyquery.Types$TypeBounds.mapBounds(Types.scala:2298)
    at tastyquery.Symbols$TypeSymbolWithBounds.default$1(Symbols.scala:736)
    at tastyquery.Symbols$TypeSymbolWithBounds.boundsAsSeenFrom(Symbols.scala:764)
    at tastyquery.Types$TypeRef.storeSymbol$2(Types.scala:1253)
    at tastyquery.Types$TypeRef.resolve(Types.scala:1257)
    at tastyquery.Types$TypeRef.ensureResolved(Types.scala:1239)
    at tastyquery.Types$TypeRef.optSymbol(Types.scala:1279)
    at tastyquery.Types$TypeRef$OfClass$.unapply(Types.scala:1382)
    at tastyquery.Types$Type.typeParams(Types.scala:529)