-
Notifications
You must be signed in to change notification settings - Fork 22
Closed
scala/scala
#6421Milestone
Description
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)
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels