Skip to content

Type inference of type variable crash with existential and super type relationship #10519

@gabriel-bezerra

Description

@gabriel-bezerra

I'm trying to compile the following code snippet

object X {
  case class D[A]()

  val xs = Seq(D[Int](), D[Boolean]())

  def g[Y](is: Seq[D[_ >: Y]]) = ???
  g(xs)
}

It compiles in dotty but crashes on scala 2.11, 2.12 and 2.13 (commit 711c8aaf0ef4ae9dd8d83276ca6a5b03a6ffcecc) with the message:

scala.reflect.internal.FatalError: 
  trying to do lub/glb of typevar ?Y
        during phase: typer

I traced the problem to isSubType in TypeComparers.scala and put some printlns to understand what was going on.

This is the output I have so far:

isWeakSubType tp1 = Seq[X.D[_ >: Boolean with Int <: AnyVal]] - tp2 = Seq[X.D[_ >: ?Y]]
isSubType tp1 = Seq[X.D[_ >: Boolean with Int <: AnyVal]] - tp2 = Seq[X.D[_ >: ?Y]] - depth = Depth(-3)
isSubType tp1 = Seq[X.D[_ >: Boolean with Int <: AnyVal]] - tp2 = Seq[X.D[_ >: ?Y]] - depth = Depth(-3)
isSubType tp1 = X.D[_ >: Boolean with Int <: AnyVal] - tp2 = X.D[_ >: ?Y] - depth = Depth(-3)
isSubType tp1 = X.D[_1] - tp2 = X.D[_ >: ?Y] - depth = Depth(-3)
[    create] ?_$2                     ( In X#g[Y]#is )
isSubType tp1 = X.D[_1] - tp2 = X.D[?_$2] - depth = Depth(-3)
isSubType tp1 = X.type - tp2 = X.type - depth = Depth(-3)
isSubType tp1 = ?_$2 - tp2 = _1 - depth = Depth(-3)
isSubType tp1 = _1 - tp2 = ?_$2 - depth = Depth(-3)
lub of List(?Y, _1) at depth Depth(1)
isSubType tp1 = _1 - tp2 = ?Y - depth = Depth(0)
isSubType tp1 = ?Y - tp2 = _1 - depth = Depth(0)
Here type Y -- crash!
scala.reflect.internal.FatalError: 
  trying to do lub/glb of typevar ?Y

I suspect the problem is around the lines:

isSubType tp1 = X.D[_1] - tp2 = X.D[?_$2] - depth = Depth(-3)
isSubType tp1 = X.type - tp2 = X.type - depth = Depth(-3)
isSubType tp1 = ?_$2 - tp2 = _1 - depth = Depth(-3)

because I don't get how it comes to invert the order of the types in this search.

May you help debug this problem?

Stack trace:

	at scala.reflect.internal.Reporting.abort(Reporting.scala:61)
	at scala.reflect.internal.Reporting.abort$(Reporting.scala:57)
	at scala.reflect.internal.SymbolTable.abort(SymbolTable.scala:16)
	at scala.reflect.internal.Types.stripType$1(Types.scala:4508)
	at scala.reflect.internal.Types.$anonfun$stripExistentialsAndTypeVars$4(Types.scala:4512)
	at scala.reflect.internal.Types.$anonfun$stripExistentialsAndTypeVars$4$adapted(Types.scala:4512)
	at scala.collection.immutable.List.foreach(List.scala:389)
	at scala.reflect.internal.Types.stripExistentialsAndTypeVars(Types.scala:4512)
	at scala.reflect.internal.Types.stripExistentialsAndTypeVars$(Types.scala:4484)
	at scala.reflect.internal.SymbolTable.stripExistentialsAndTypeVars(SymbolTable.scala:16)
	at scala.reflect.internal.tpe.GlbLubs.lub1$1(GlbLubs.scala:310)
	at scala.reflect.internal.tpe.GlbLubs.lub0$1(GlbLubs.scala:304)
	at scala.reflect.internal.tpe.GlbLubs.lub(GlbLubs.scala:401)
	at scala.reflect.internal.tpe.GlbLubs.lub$(GlbLubs.scala:281)
	at scala.reflect.internal.SymbolTable.lub(SymbolTable.scala:16)
	at scala.reflect.internal.tpe.GlbLubs.lub(GlbLubs.scala:260)
	at scala.reflect.internal.tpe.GlbLubs.lub$(GlbLubs.scala:253)
	at scala.reflect.internal.SymbolTable.lub(SymbolTable.scala:16)
	at scala.reflect.internal.tpe.TypeConstraints.solveOne$1(TypeConstraints.scala:248)
	at scala.reflect.internal.tpe.TypeConstraints.$anonfun$solve$9(TypeConstraints.scala:260)
	at scala.reflect.internal.tpe.TypeConstraints.$anonfun$solve$9$adapted(TypeConstraints.scala:260)
	at scala.reflect.internal.util.Collections.foreach3(Collections.scala:244)
	at scala.reflect.internal.util.Collections.foreach3$(Collections.scala:239)
	at scala.reflect.internal.SymbolTable.foreach3(SymbolTable.scala:16)
	at scala.reflect.internal.tpe.TypeConstraints.solve(TypeConstraints.scala:260)
	at scala.reflect.internal.tpe.TypeConstraints.solve$(TypeConstraints.scala:192)
	at scala.reflect.internal.SymbolTable.solve(SymbolTable.scala:16)
	at scala.reflect.internal.Types$ExistentialType.withTypeVars(Types.scala:2818)
	at scala.reflect.internal.tpe.TypeComparers.thirdTry$1(TypeComparers.scala:509)
	at scala.reflect.internal.tpe.TypeComparers.secondTry$1(TypeComparers.scala:475)
	at scala.reflect.internal.tpe.TypeComparers.firstTry$1(TypeComparers.scala:450)
	at scala.reflect.internal.tpe.TypeComparers.isSubType2(TypeComparers.scala:572)
	at scala.reflect.internal.tpe.TypeComparers.isSubType1(TypeComparers.scala:331)
	at scala.reflect.internal.tpe.TypeComparers.isSubType(TypeComparers.scala:289)
	at scala.reflect.internal.tpe.TypeComparers.isSubType$(TypeComparers.scala:250)
	at scala.reflect.internal.SymbolTable.isSubType(SymbolTable.scala:16)
	at scala.reflect.internal.tpe.TypeComparers.secondTry$1(TypeComparers.scala:470)
	at scala.reflect.internal.tpe.TypeComparers.firstTry$1(TypeComparers.scala:450)
	at scala.reflect.internal.tpe.TypeComparers.isSubType2(TypeComparers.scala:572)
	at scala.reflect.internal.tpe.TypeComparers.isSubType1(TypeComparers.scala:331)
	at scala.reflect.internal.tpe.TypeComparers.isSubType(TypeComparers.scala:289)
	at scala.reflect.internal.tpe.TypeComparers.isSubType$(TypeComparers.scala:250)
	at scala.reflect.internal.SymbolTable.isSubType(SymbolTable.scala:16)
	at scala.reflect.internal.Types.isSubArg$1(Types.scala:4237)
	at scala.reflect.internal.Types.$anonfun$isSubArgs$2(Types.scala:4240)
	at scala.reflect.internal.Types.$anonfun$isSubArgs$2$adapted(Types.scala:4240)
	at scala.reflect.internal.util.Collections.corresponds3(Collections.scala:24)
	at scala.reflect.internal.util.Collections.corresponds3$(Collections.scala:21)
	at scala.reflect.internal.SymbolTable.corresponds3(SymbolTable.scala:16)
	at scala.reflect.internal.Types.isSubArgs(Types.scala:4240)
	at scala.reflect.internal.Types.isSubArgs$(Types.scala:4234)
	at scala.reflect.internal.SymbolTable.isSubArgs(SymbolTable.scala:16)
	at scala.reflect.internal.tpe.TypeComparers.firstTry$1(TypeComparers.scala:422)
	at scala.reflect.internal.tpe.TypeComparers.isSubType2(TypeComparers.scala:572)
	at scala.reflect.internal.tpe.TypeComparers.isSubType1(TypeComparers.scala:331)
	at scala.reflect.internal.tpe.TypeComparers.isSubType(TypeComparers.scala:289)
	at scala.reflect.internal.tpe.TypeComparers.isSubType$(TypeComparers.scala:250)
	at scala.reflect.internal.SymbolTable.isSubType(SymbolTable.scala:16)
	at scala.reflect.internal.tpe.TypeComparers.retry$4(TypeComparers.scala:480)
	at scala.reflect.internal.tpe.TypeComparers.thirdTryRef$1(TypeComparers.scala:491)
	at scala.reflect.internal.tpe.TypeComparers.firstTry$1(TypeComparers.scala:431)
	at scala.reflect.internal.tpe.TypeComparers.isSubType2(TypeComparers.scala:572)
	at scala.reflect.internal.tpe.TypeComparers.isSubType1(TypeComparers.scala:331)
	at scala.reflect.internal.tpe.TypeComparers.isSubType(TypeComparers.scala:289)
	at scala.reflect.internal.tpe.TypeComparers.isSubType$(TypeComparers.scala:250)
	at scala.reflect.internal.SymbolTable.isSubType(SymbolTable.scala:16)
	at scala.reflect.internal.tpe.TypeComparers.isWeakSubType(TypeComparers.scala:597)
	at scala.reflect.internal.tpe.TypeComparers.isWeakSubType$(TypeComparers.scala:576)
	at scala.reflect.internal.SymbolTable.isWeakSubType(SymbolTable.scala:16)
	at scala.reflect.internal.Types$Type.weak_$less$colon$less(Types.scala:855)
	at scala.tools.nsc.typechecker.Infer$Inferencer.isCompatible(Infer.scala:308)
	at scala.tools.nsc.typechecker.Infer$Inferencer.$anonfun$methTypeArgs$3(Infer.scala:555)
	at scala.tools.nsc.typechecker.Infer$Inferencer.$anonfun$methTypeArgs$3$adapted(Infer.scala:547)
	at scala.reflect.internal.util.Collections.map2(Collections.scala:92)
	at scala.reflect.internal.util.Collections.map2$(Collections.scala:87)
	at scala.reflect.internal.SymbolTable.map2(SymbolTable.scala:16)
	at scala.tools.nsc.typechecker.Infer$Inferencer.methTypeArgs(Infer.scala:547)
	at scala.tools.nsc.typechecker.Infer$Inferencer.inferMethodInstance(Infer.scala:994)
	at scala.tools.nsc.typechecker.Typers$Typer.handlePolymorphicCall$1(Typers.scala:3656)
	at scala.tools.nsc.typechecker.Typers$Typer.doTypedApply(Typers.scala:3661)
	at scala.tools.nsc.typechecker.Typers$Typer.normalTypedApply$1(Typers.scala:4734)
	at scala.tools.nsc.typechecker.Typers$Typer.typedApply$1(Typers.scala:4762)
	at scala.tools.nsc.typechecker.Typers$Typer.typedInAnyMode$1(Typers.scala:5552)
	at scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:5569)
	at scala.tools.nsc.typechecker.Typers$Typer.runTyper$1(Typers.scala:5605)
	at scala.tools.nsc.typechecker.Typers$Typer.typedInternal(Typers.scala:5635)
	at scala.tools.nsc.typechecker.Typers$Typer.body$2(Typers.scala:5579)
	at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:5583)
	at scala.tools.nsc.typechecker.Typers$Typer.typedByValueExpr(Typers.scala:5666)
	at scala.tools.nsc.typechecker.Typers$Typer.typedStat$1(Typers.scala:3080)
	at scala.tools.nsc.typechecker.Typers$Typer.$anonfun$typedStats$10(Typers.scala:3225)
	at scala.collection.immutable.List.loop$1(List.scala:176)
	at scala.collection.immutable.List.mapConserve(List.scala:200)
	at scala.tools.nsc.typechecker.Typers$Typer.typedStats(Typers.scala:3225)
	at scala.tools.nsc.typechecker.Typers$Typer.typedTemplate(Typers.scala:1988)
	at scala.tools.nsc.typechecker.Typers$Typer.typedModuleDef(Typers.scala:1859)
	at scala.tools.nsc.typechecker.Typers$Typer.typedMemberDef$1(Typers.scala:5519)
	at scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:5568)
	at scala.tools.nsc.typechecker.Typers$Typer.runTyper$1(Typers.scala:5605)
	at scala.tools.nsc.typechecker.Typers$Typer.typedInternal(Typers.scala:5635)
	at scala.tools.nsc.typechecker.Typers$Typer.body$2(Typers.scala:5579)
	at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:5583)
	at scala.tools.nsc.typechecker.Typers$Typer.typedByValueExpr(Typers.scala:5666)
	at scala.tools.nsc.typechecker.Typers$Typer.typedStat$1(Typers.scala:3080)
	at scala.tools.nsc.typechecker.Typers$Typer.$anonfun$typedStats$10(Typers.scala:3225)
	at scala.collection.immutable.List.loop$1(List.scala:176)
	at scala.collection.immutable.List.mapConserve(List.scala:200)
	at scala.tools.nsc.typechecker.Typers$Typer.typedStats(Typers.scala:3225)
	at scala.tools.nsc.typechecker.Typers$Typer.typedPackageDef$1(Typers.scala:5218)
	at scala.tools.nsc.typechecker.Typers$Typer.typedMemberDef$1(Typers.scala:5521)
	at scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:5568)
	at scala.tools.nsc.typechecker.Typers$Typer.runTyper$1(Typers.scala:5605)
	at scala.tools.nsc.typechecker.Typers$Typer.typedInternal(Typers.scala:5635)
	at scala.tools.nsc.typechecker.Typers$Typer.body$2(Typers.scala:5579)
	at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:5583)
	at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:5662)
	at scala.tools.nsc.typechecker.Analyzer$typerFactory$$anon$3.apply(Analyzer.scala:102)
	at scala.tools.nsc.Global$GlobalPhase.$anonfun$applyPhase$1(Global.scala:427)
	at scala.tools.nsc.Global$GlobalPhase.withCurrentUnitNoLog(Global.scala:420)
	at scala.tools.nsc.Global$GlobalPhase.withCurrentUnit(Global.scala:411)
	at scala.tools.nsc.Global$GlobalPhase.applyPhase(Global.scala:427)
	at scala.tools.nsc.typechecker.Analyzer$typerFactory$$anon$3.$anonfun$run$1(Analyzer.scala:94)
	at scala.tools.nsc.typechecker.Analyzer$typerFactory$$anon$3.$anonfun$run$1$adapted(Analyzer.scala:93)
	at scala.collection.Iterator.foreach(Iterator.scala:929)
	at scala.collection.Iterator.foreach$(Iterator.scala:929)
	at scala.collection.AbstractIterator.foreach(Iterator.scala:1417)
	at scala.tools.nsc.typechecker.Analyzer$typerFactory$$anon$3.run(Analyzer.scala:93)
	at scala.tools.nsc.Global$Run.compileUnitsInternal(Global.scala:1434)
	at scala.tools.nsc.Global$Run.compileUnits(Global.scala:1418)
	at scala.tools.nsc.Global$Run.compileSources(Global.scala:1413)
	at scala.tools.nsc.Global$Run.compile(Global.scala:1518)
	at scala.tools.partest.nest.DirectCompiler.execCompile$1(DirectCompiler.scala:114)
	at scala.tools.partest.nest.DirectCompiler.compile(DirectCompiler.scala:123)
	at scala.tools.partest.nest.Runner.attemptCompile(Runner.scala:439)
	at scala.tools.partest.nest.Runner$ScalaAndJava.result$lzycompute(Runner.scala:498)
	at scala.tools.partest.nest.Runner$ScalaAndJava.result(Runner.scala:498)
	at scala.tools.partest.nest.Runner$CompileRound.isOk(Runner.scala:484)
	at scala.tools.partest.nest.Runner.$anonfun$runTestCommon$3(Runner.scala:529)
	at scala.runtime.java8.JFunction0$mcZ$sp.apply(JFunction0$mcZ$sp.java:12)
	at scala.tools.partest.nest.Runner.nextTestAction(Runner.scala:143)
	at scala.tools.partest.nest.Runner.nextTestActionExpectTrue(Runner.scala:148)
	at scala.tools.partest.nest.Runner.$anonfun$runTestCommon$2(Runner.scala:529)
	at scala.tools.partest.nest.Runner.$anonfun$runTestCommon$2$adapted(Runner.scala:529)
	at scala.collection.LinearSeqOptimized.forall(LinearSeqOptimized.scala:81)
	at scala.collection.LinearSeqOptimized.forall$(LinearSeqOptimized.scala:78)
	at scala.collection.immutable.List.forall(List.scala:86)
	at scala.tools.partest.nest.Runner.$anonfun$runTestCommon$1(Runner.scala:529)
	at scala.tools.partest.nest.Runner.runInContext(Runner.scala:415)
	at scala.tools.partest.nest.Runner.runTestCommon(Runner.scala:529)
	at scala.tools.partest.nest.Runner.run(Runner.scala:650)
	at scala.tools.partest.nest.SuiteRunner.$anonfun$runTest$1(Runner.scala:774)
	at scala.tools.partest.package$.timed(package.scala:129)
	at scala.tools.partest.nest.SuiteRunner.liftedTree1$1(Runner.scala:774)
	at scala.tools.partest.nest.SuiteRunner.runTest(Runner.scala:774)
	at scala.tools.partest.nest.SuiteRunner.$anonfun$runTestsForFiles$2(Runner.scala:789)
	at scala.tools.partest.package$$anon$2.call(package.scala:135)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:748)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions