Skip to content

StackOverflowError in the compiler if a subclass provides an abstract type projection from a higher type as a type parameter to its base class #12763

Open
@noresttherein

Description

@noresttherein

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)

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions