Open
Description
using Scala 2.13.6
trait Root { type A; type B }
type Nasty[X, Y] = Root { type A = X; type B = Y }
type ProjectB[Y] = Root { type B = Y }
class Marker[A, T[X] <: ProjectB[X]]
class Problem[T[A] <: Nasty[S, A], S, O]
(val underlying :Problem[T, S, O],
val seq :Seq[ProjectB[O]] = Seq.empty[Nasty[_, O]])
{
lazy val issue :Nasty[S, O] = ???
def mark[Y](m :Marker[Y, T]) :Problem[T, S, Y] = ???
def copy[E](position :Marker[E, T]) :Problem[T, S, E] =
new Problem(mark(position)) {
override lazy val issue = Problem.this.issue.asInstanceOf[Nasty[S, E]]
}
}
java.lang.StackOverflowError
at scala.reflect.internal.Symbols$TypeSymbol.tpe_$times(Symbols.scala:3215)
at scala.reflect.internal.Symbols$Symbol.typeOfThis(Symbols.scala:2115)
at scala.reflect.internal.Types$ThisType.underlying(Types.scala:1411)
at scala.reflect.internal.Types$SimpleTypeProxy.widen(Types.scala:159)
at scala.reflect.internal.Types$SimpleTypeProxy.widen$(Types.scala:159)
at scala.reflect.internal.Types$SingletonType.widen(Types.scala:1111)
at scala.reflect.internal.tpe.TypeMaps$AsSeenFromMap.scala$reflect$internal$tpe$TypeMaps$AsSeenFromMap$$matchesPrefixAndClass(TypeMaps.scala:589)
at scala.reflect.internal.tpe.TypeMaps$AsSeenFromMap.loop$4(TypeMaps.scala:644)
at scala.reflect.internal.tpe.TypeMaps$AsSeenFromMap.thisTypeAsSeen(TypeMaps.scala:651)
at scala.reflect.internal.tpe.TypeMaps$AsSeenFromMap.apply(TypeMaps.scala:443)
at scala.reflect.internal.Types$TypeRef.mapOver(Types.scala:2371)
at scala.reflect.internal.tpe.TypeMaps$AsSeenFromMap.apply(TypeMaps.scala:446)
at scala.reflect.internal.Types$TypeVar.mapOver(Types.scala:3803)
at scala.reflect.internal.tpe.TypeMaps$AsSeenFromMap.apply(TypeMaps.scala:446)
at scala.reflect.internal.Types$Type.asSeenFrom(Types.scala:705)
at scala.reflect.internal.Types$TypeRef.relativize(Types.scala:2466)
at scala.reflect.internal.Types$AliasTypeRef.betaReduce(Types.scala:2299)
at scala.reflect.internal.Types$AliasTypeRef.betaReduce$(Types.scala:2299)
at scala.reflect.internal.Types$AliasNoArgsTypeRef.betaReduce(Types.scala:2742)
at scala.reflect.internal.Types$AliasTypeRef.dealias(Types.scala:2243)
at scala.reflect.internal.Types$AliasTypeRef.dealias$(Types.scala:2243)
at scala.reflect.internal.Types$AliasNoArgsTypeRef.dealias(Types.scala:2742)
at scala.reflect.internal.Types$AliasTypeRef.dealias(Types.scala:2243)
at scala.reflect.internal.Types$AliasTypeRef.dealias$(Types.scala:2243)
at scala.reflect.internal.Types$AliasNoArgsTypeRef.dealias(Types.scala:2742)
at scala.reflect.internal.Types$AliasTypeRef.dealias(Types.scala:2243)
at scala.reflect.internal.Types$AliasTypeRef.dealias$(Types.scala:2243)
at scala.reflect.internal.Types$AliasNoArgsTypeRef.dealias(Types.scala:2742)
at scala.reflect.internal.Types$AliasTypeRef.dealias(Types.scala:2243)
at scala.reflect.internal.Types$AliasTypeRef.dealias$(Types.scala:2243)
at scala.reflect.internal.Types$AliasNoArgsTypeRef.dealias(Types.scala:2742)
at scala.reflect.internal.Types$AliasTypeRef.dealias(Types.scala:2243)
at scala.reflect.internal.Types$AliasTypeRef.dealias$(Types.scala:2243)
at scala.reflect.internal.Types$AliasNoArgsTypeRef.dealias(Types.scala:2742)
at scala.reflect.internal.Types$AliasTypeRef.dealias(Types.scala:2243)
at scala.reflect.internal.Types$AliasTypeRef.dealias$(Types.scala:2243)
at scala.reflect.internal.Types$AliasNoArgsTypeRef.dealias(Types.scala:2742)
at scala.reflect.internal.Types$AliasTypeRef.dealias(Types.scala:2243)
at scala.reflect.internal.Types$AliasTypeRef.dealias$(Types.scala:2243)
The issue is the copy method, combining type inference, higher types and default parameters.
It is pretty close to minimal:
- Specifying the type parameters for the anonymous Problem explicitly fixes the issue;
- Replacing
Nasty[_, O]
withProjectB[O]
fixes the issue; - Specifying the default argument explicitly fixes the issue;
- Not using an anonymous class with overriden lazy val fixes the issue