Open
Description
Reproduction steps
Scala version: 2.13.10
trait F[O] { type Value }
trait B[V]
trait E[M[O] <: F[O], V] extends B[V]
trait G[M[O] <: F[O]] extends E[M, M[Unit]#Value]
type TE = E[M, _] forSome { type M[O] <: F[O] }
type TG = G[M] forSome { type M[O] <: F[O] }
def test[M[O] <: F[O], V](e :E[M, V]) :Unit = (e :TE) match {
case _ :TG =>
}
Problem
scalac: Error: java.lang.StackOverflowError
java.lang.StackOverflowError
at scala.reflect.internal.tpe.TypeConstraints$UndoLog.scala$reflect$internal$tpe$TypeConstraints$UndoLog$$$outer(TypeConstraints.scala:33)
at scala.reflect.internal.tpe.TypeConstraints$UndoLog.undoTo(TypeConstraints.scala:48)
at scala.reflect.internal.tpe.TypeComparers.isSameType(TypeComparers.scala:119)
at scala.reflect.internal.tpe.TypeComparers.isSameType$(TypeComparers.scala:105)
at scala.reflect.internal.SymbolTable.isSameType(SymbolTable.scala:28)
at scala.reflect.internal.Types$Type.$eq$colon$eq(Types.scala:864)
at scala.reflect.internal.Types$TypeVar.checkIsSameType$1(Types.scala:3697)
at scala.reflect.internal.Types$TypeVar.registerTypeEquality(Types.scala:3702)
at scala.reflect.internal.tpe.TypeComparers.mutateNonTypeConstructs$1(TypeComparers.scala:217)
at scala.reflect.internal.tpe.TypeComparers.isSameType2(TypeComparers.scala:261)
at scala.reflect.internal.tpe.TypeComparers.isSameType2$(TypeComparers.scala:198)
at scala.reflect.internal.SymbolTable.isSameType2(SymbolTable.scala:28)
at scala.reflect.internal.tpe.TypeComparers.isSameType1(TypeComparers.scala:142)
at scala.reflect.internal.tpe.TypeComparers.isSameType(TypeComparers.scala:117)
at scala.reflect.internal.tpe.TypeComparers.isSameType$(TypeComparers.scala:105)
at scala.reflect.internal.SymbolTable.isSameType(SymbolTable.scala:28)
at scala.reflect.internal.Types$Type.$eq$colon$eq(Types.scala:864)
at scala.reflect.internal.Types$TypeVar.checkIsSameType$1(Types.scala:3697)
at scala.reflect.internal.Types$TypeVar.registerTypeEquality(Types.scala:3702)
at scala.reflect.internal.tpe.TypeComparers.mutateNonTypeConstructs$1(TypeComparers.scala:217)
at scala.reflect.internal.tpe.TypeComparers.isSameType2(TypeComparers.scala:261)
at scala.reflect.internal.tpe.TypeComparers.isSameType2$(TypeComparers.scala:198)
at scala.reflect.internal.SymbolTable.isSameType2(SymbolTable.scala:28)
at scala.reflect.internal.tpe.TypeComparers.isSameType1(TypeComparers.scala:142)
at scala.reflect.internal.tpe.TypeComparers.isSameType(TypeComparers.scala:117)
at scala.reflect.internal.tpe.TypeComparers.isSameType$(TypeComparers.scala:105)
at scala.reflect.internal.SymbolTable.isSameType(SymbolTable.scala:28)
at scala.reflect.internal.Types$Type.$eq$colon$eq(Types.scala:864)
at scala.reflect.internal.Types$TypeVar.checkIsSameType$1(Types.scala:3697)
at scala.reflect.internal.Types$TypeVar.registerTypeEquality(Types.scala:3702)
at scala.reflect.internal.tpe.TypeComparers.mutateNonTypeConstructs$1(TypeComparers.scala:217)
at scala.reflect.internal.tpe.TypeComparers.isSameType2(TypeComparers.scala:261)
at scala.reflect.internal.tpe.TypeComparers.isSameType2$(TypeComparers.scala:198)
at scala.reflect.internal.SymbolTable.isSameType2(SymbolTable.scala:28)
at scala.reflect.internal.tpe.TypeComparers.isSameType1(TypeComparers.scala:142)
at scala.reflect.internal.tpe.TypeComparers.isSameType(TypeComparers.scala:117)
at scala.reflect.internal.tpe.TypeComparers.isSameType$(TypeComparers.scala:105)
at scala.reflect.internal.SymbolTable.isSameType(SymbolTable.scala:28)