bug icon indicating copy to clipboard operation
bug copied to clipboard

Infinite loop / StackOverflowError in typer

Open scabug opened this issue 11 years ago • 3 comments

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)

scabug avatar Jul 29 '14 17:07 scabug

Imported From: https://issues.scala-lang.org/browse/SI-8757?orig=1 Reporter: Peter Brant (pbrant) Affected Versions: 2.11.2

scabug avatar Jul 29 '14 17:07 scabug

@retronym said: This regressed in https://github.com/scala/scala/pull/3525

scabug avatar Jul 29 '14 20:07 scabug

@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)

scabug avatar Jul 29 '14 20:07 scabug