bug
bug copied to clipboard
Infinite loop / StackOverflowError in typer
I feel a little guilty about posting this. The code is pretty unreasonable. In any case...
The same code compiles in 2.10.4.
class Fields {
trait Field {
type ValueType
type OtherValueType
}
private def defaultReadOnlyValue[V, O](
field: Field {type ValueType = V; type OtherValueType = O}
): String = "asdf"
// StackOverflowError
private def toForm[V, O](
field: Field {type ValueType = V; type OtherValueType = O}
): String = {
toForm(field, "asdf")
}
/*
// WORKS
private def toForm[V, O](
field: Field {type ValueType = V; type OtherValueType = O}
): String = {
toForm[V, O](field, "asdf")
}
// WORKS
private def toForm[V, O](
field: Field {type ValueType = V; type OtherValueType = O}
): String = {
toForm(field, "asdf", defaultReadOnlyValue[V, O] _)
}
*/
protected[this] def toForm[V, O](
field: Field {type ValueType = V; type OtherValueType = O},
s: String,
toString: Field {type ValueType = V; type OtherValueType = O} => String = defaultReadOnlyValue[V, O] _
): String = "asdf"
}
error: java.lang.StackOverflowError
at scala.reflect.internal.Symbols$Symbol.isMonomorphicType(Symbols.scala:827)
at scala.reflect.internal.Symbols$Symbol.typeParams(Symbols.scala:1645)
at scala.reflect.internal.Types$NoArgsTypeRef.typeParams(Types.scala:1926)
at scala.reflect.internal.Types$NoArgsTypeRef.isHigherKinded(Types.scala:1925)
at scala.reflect.internal.Symbols$Symbol.isMonomorphicType(Symbols.scala:830)
at scala.reflect.internal.Symbols$Symbol.typeParams(Symbols.scala:1645)
at scala.reflect.internal.Types$NoArgsTypeRef.typeParams(Types.scala:1926)
at scala.reflect.internal.Types$NoArgsTypeRef.isHigherKinded(Types.scala:1925)
at scala.reflect.internal.Symbols$Symbol.isMonomorphicType(Symbols.scala:830)
at scala.reflect.internal.Symbols$Symbol.typeParams(Symbols.scala:1645)
at scala.reflect.internal.Types$NoArgsTypeRef.typeParams(Types.scala:1926)
at scala.reflect.internal.Types$NoArgsTypeRef.isHigherKinded(Types.scala:1925)
at scala.reflect.internal.Symbols$Symbol.isMonomorphicType(Symbols.scala:830)
at scala.reflect.internal.Symbols$Symbol.typeParams(Symbols.scala:1645)
at scala.reflect.internal.Types$NoArgsTypeRef.typeParams(Types.scala:1926)
at scala.reflect.internal.Types$NoArgsTypeRef.isHigherKinded(Types.scala:1925)
at scala.reflect.internal.Symbols$Symbol.isMonomorphicType(Symbols.scala:830)
at scala.reflect.internal.Symbols$Symbol.typeParams(Symbols.scala:1645)
at scala.reflect.internal.Types$NoArgsTypeRef.typeParams(Types.scala:1926)
at scala.reflect.internal.Types$NoArgsTypeRef.isHigherKinded(Types.scala:1925)
Imported From: https://issues.scala-lang.org/browse/SI-8757?orig=1 Reporter: Peter Brant (pbrant) Affected Versions: 2.11.2
@retronym said: This regressed in https://github.com/scala/scala/pull/3525
@retronym said: Here's the start of the overflow:
% scalac-hash 5984461~1 -J-Xss200K sandbox/test.scala
...
at scala.reflect.internal.Types$NoArgsTypeRef.isHigherKinded(Types.scala:1900)
at scala.reflect.internal.Symbols$Symbol.isMonomorphicType(Symbols.scala:786)
at scala.reflect.internal.Symbols$Symbol.typeParams(Symbols.scala:1596)
at scala.reflect.internal.Types$NoArgsTypeRef.typeParams(Types.scala:1901)
at scala.reflect.internal.Types$NoArgsTypeRef.isHigherKinded(Types.scala:1900)
at scala.reflect.internal.Symbols$Symbol.isMonomorphicType(Symbols.scala:786)
at scala.reflect.internal.Symbols$Symbol.typeParams(Symbols.scala:1596)
at scala.reflect.internal.Types$NoArgsTypeRef.typeParams(Types.scala:1901)
at scala.reflect.internal.Types$NoArgsTypeRef.isHigherKinded(Types.scala:1900)
at scala.reflect.internal.Symbols$Symbol.isMonomorphicType(Symbols.scala:786)
at scala.reflect.internal.Symbols$Symbol.typeParams(Symbols.scala:1596)
at scala.reflect.internal.Types$NoArgsTypeRef.typeParams(Types.scala:1901)
at scala.reflect.internal.Types$NoArgsTypeRef.isHigherKinded(Types.scala:1900)
at scala.reflect.internal.Symbols$Symbol.isMonomorphicType(Symbols.scala:786)
at scala.reflect.internal.Symbols$Symbol.typeParams(Symbols.scala:1596)
at scala.reflect.internal.Types$NoArgsTypeRef.typeParams(Types.scala:1901)
at scala.reflect.internal.Types$NoArgsTypeRef.isHigherKinded(Types.scala:1900)
at scala.reflect.internal.Symbols$Symbol.isMonomorphicType(Symbols.scala:786)
at scala.reflect.internal.Symbols$Symbol.typeParams(Symbols.scala:1596)
at scala.reflect.internal.Types$NoArgsTypeRef.typeParams(Types.scala:1901)
at scala.reflect.internal.Types$class.typeRef(Types.scala:3431)
at scala.reflect.internal.SymbolTable.typeRef(SymbolTable.scala:15)
at scala.reflect.internal.Types$class.copyTypeRef(Types.scala:3452)
at scala.reflect.internal.SymbolTable.copyTypeRef(SymbolTable.scala:15)
at scala.reflect.internal.tpe.TypeMaps$TypeMap.mapOver(TypeMaps.scala:118)
at scala.reflect.internal.tpe.TypeMaps$SubstThisMap.apply(TypeMaps.scala:827)
at scala.reflect.internal.Types$Type.substThis(Types.scala:710)
at scala.reflect.internal.Types$Type.substThisAndSym(Types.scala:725)
at scala.reflect.internal.Types$$anonfun$copyRefinedType$2$$anonfun$apply$11.apply(Types.scala:3414)
at scala.reflect.internal.Types$$anonfun$copyRefinedType$2$$anonfun$apply$11.apply(Types.scala:3414)
at scala.reflect.internal.Symbols$Symbol.modifyInfo(Symbols.scala:1408)
at scala.reflect.internal.Types$class.copyRefinedType(Types.scala:3413)
at scala.reflect.internal.SymbolTable.copyRefinedType(SymbolTable.scala:15)
at scala.reflect.internal.tpe.TypeMaps$TypeMap.mapOver(TypeMaps.scala:159)
at scala.reflect.internal.tpe.TypeMaps$typeVarToOriginMap$.apply(TypeMaps.scala:976)
at scala.reflect.internal.Types$Type.isGround(Types.scala:944)
at scala.reflect.internal.Types$Type.findMember(Types.scala:998)
at scala.reflect.internal.Types$Type.memberBasedOnName(Types.scala:617)
at scala.reflect.internal.Types$Type.nonPrivateMember(Types.scala:593)
at scala.reflect.internal.Types$class.specializesSym(Types.scala:4099)
at scala.reflect.internal.SymbolTable.specializesSym(SymbolTable.scala:15)
at scala.reflect.internal.tpe.TypeComparers$$anonfun$thirdTry$1$2.apply(TypeComparers.scala:481)
at scala.reflect.internal.tpe.TypeComparers$$anonfun$thirdTry$1$2.apply(TypeComparers.scala:481)
at scala.collection.Iterator$class.forall(Iterator.scala:755)
at scala.collection.AbstractIterator.forall(Iterator.scala:1174)
at scala.collection.IterableLike$class.forall(IterableLike.scala:75)
at scala.reflect.internal.Scopes$Scope.forall(Scopes.scala:51)
at scala.reflect.internal.tpe.TypeComparers$class.thirdTry$1(TypeComparers.scala:481)
at scala.reflect.internal.tpe.TypeComparers$class.secondTry$1(TypeComparers.scala:450)
at scala.reflect.internal.tpe.TypeComparers$class.firstTry$1(TypeComparers.scala:426)
at scala.reflect.internal.tpe.TypeComparers$class.isSubType2(TypeComparers.scala:552)
at scala.reflect.internal.tpe.TypeComparers$class.isSubType1(TypeComparers.scala:320)
at scala.reflect.internal.tpe.TypeComparers$class.isSubType(TypeComparers.scala:278)
at scala.reflect.internal.SymbolTable.isSubType(SymbolTable.scala:15)
at scala.reflect.internal.Types$class.isSubArg$1(Types.scala:4080)
at scala.reflect.internal.Types$$anonfun$isSubArgs$2.apply(Types.scala:4083)
at scala.reflect.internal.Types$$anonfun$isSubArgs$2.apply(Types.scala:4083)
at scala.reflect.internal.util.Collections$class.corresponds3(Collections.scala:24)
at scala.reflect.internal.SymbolTable.corresponds3(SymbolTable.scala:15)
at scala.reflect.internal.Types$class.isSubArgs(Types.scala:4083)
at scala.reflect.internal.SymbolTable.isSubArgs(SymbolTable.scala:15)
at scala.reflect.internal.tpe.TypeComparers$class.firstTry$1(TypeComparers.scala:402)
at scala.reflect.internal.tpe.TypeComparers$class.isSubType2(TypeComparers.scala:552)
at scala.reflect.internal.tpe.TypeComparers$class.isSubType1(TypeComparers.scala:320)
at scala.reflect.internal.tpe.TypeComparers$class.isSubType(TypeComparers.scala:278)
at scala.reflect.internal.SymbolTable.isSubType(SymbolTable.scala:15)
at scala.reflect.internal.tpe.TypeComparers$class.isWeakSubType(TypeComparers.scala:575)
at scala.reflect.internal.SymbolTable.isWeakSubType(SymbolTable.scala:15)
at scala.reflect.internal.Types$Type.weak_$less$colon$less(Types.scala:811)
at scala.tools.nsc.typechecker.Infer$Inferencer.scala$tools$nsc$typechecker$Infer$Inferencer$$isCompatible(Infer.scala:302)
at scala.tools.nsc.typechecker.Infer$Inferencer$$anonfun$methTypeArgs$2.apply(Infer.scala:541)
at scala.tools.nsc.typechecker.Infer$Inferencer$$anonfun$methTypeArgs$2.apply(Infer.scala:535)
at scala.reflect.internal.util.Collections$class.map2(Collections.scala:79)
at scala.reflect.internal.SymbolTable.map2(SymbolTable.scala:15)