Skip to content

GADT crash at pruneErasedDefs (union of wildcards) #8319

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
bishabosha opened this issue Feb 15, 2020 · 0 comments
Closed

GADT crash at pruneErasedDefs (union of wildcards) #8319

bishabosha opened this issue Feb 15, 2020 · 0 comments

Comments

@bishabosha
Copy link
Member

bishabosha commented Feb 15, 2020

minimized code

package example

sealed abstract class Tree[T]
case class Lam[T,U]() extends Tree[Any]
case class App[T,U]() extends Tree[Any]
case class Var()      extends Tree[Any]

object Branch:
  def unapply(branch: Lam[?,?] | App[?,?]): true = true

private def foo(s: Option[Tree[?]]) = s match // seems to only occur in a nested pattern
  case Some(_: Var)   => true // must come first
  case Some(Branch()) => true // must be unapply and not direct type check
  case _              => false

Crash output (click arrow to expand)

exception occurred while compiling local/eec.scala
NoExplanation(bad parameter reference (example.Lam[?, ?] | example.App[?, ?])#T at pruneErasedDefs
the parameter is type T in class Lam but the prefix example.Lam[?, ?] | example.App[?, ?]
does not define any corresponding arguments.) while compiling local/eec.scala
Exception in thread "main" dotty.tools.dotc.core.TypeError: bad parameter reference (example.Lam[?, ?] | example.App[?, ?])#T at pruneErasedDefs
the parameter is type T in class Lam but the prefix example.Lam[?, ?] | example.App[?, ?]
does not define any corresponding arguments.
	at dotty.tools.dotc.core.Types$NamedType.argDenot(Types.scala:2069)
	at dotty.tools.dotc.core.Types$NamedType.fromDesignator$1(Types.scala:1984)
	at dotty.tools.dotc.core.Types$NamedType.computeDenot(Types.scala:2002)
	at dotty.tools.dotc.core.Types$NamedType.denot(Types.scala:1958)
	at dotty.tools.dotc.core.Types$NamedType.info(Types.scala:1947)
	at dotty.tools.dotc.core.TypeComparer.compareNamed$1(TypeComparer.scala:236)
	at dotty.tools.dotc.core.TypeComparer.firstTry$1(TypeComparer.scala:282)
	at dotty.tools.dotc.core.TypeComparer.op$1(TypeComparer.scala:1098)
	at dotty.tools.dotc.core.TypeComparer.recur(TypeComparer.scala:1117)
	at dotty.tools.dotc.core.TypeComparer.isSubType(TypeComparer.scala:162)
	at dotty.tools.dotc.core.TypeComparer.isSubType(TypeComparer.scala:172)
	at dotty.tools.dotc.core.TypeComparer.isSubArg$1(TypeComparer.scala:1270)
	at dotty.tools.dotc.core.TypeComparer.compareCaptured$1(TypeComparer.scala:1242)
	at dotty.tools.dotc.core.TypeComparer.isSubArg$1(TypeComparer.scala:1268)
	at dotty.tools.dotc.core.TypeComparer.recurArgs$1(TypeComparer.scala:1275)
	at dotty.tools.dotc.core.TypeComparer.isSubArgs(TypeComparer.scala:1278)
	at dotty.tools.dotc.core.TypeComparer.checkSubArgs$1(TypeComparer.scala:868)
	at dotty.tools.dotc.core.TypeComparer.loop$3(TypeComparer.scala:870)
	at dotty.tools.dotc.core.TypeComparer.isMatchingApply$1(TypeComparer.scala:889)
	at dotty.tools.dotc.core.TypeComparer.compareAppliedType2$1(TypeComparer.scala:982)
	at dotty.tools.dotc.core.TypeComparer.thirdTry$1(TypeComparer.scala:512)
	at dotty.tools.dotc.core.TypeComparer.secondTry$1(TypeComparer.scala:462)
	at dotty.tools.dotc.core.TypeComparer.firstTry$1(TypeComparer.scala:357)
	at dotty.tools.dotc.core.TypeComparer.op$1(TypeComparer.scala:1098)
	at dotty.tools.dotc.core.TypeComparer.recur(TypeComparer.scala:1117)
	at dotty.tools.dotc.core.TypeComparer.secondTry$1(TypeComparer.scala:449)
	at dotty.tools.dotc.core.TypeComparer.firstTry$1(TypeComparer.scala:357)
	at dotty.tools.dotc.core.TypeComparer.op$1(TypeComparer.scala:1098)
	at dotty.tools.dotc.core.TypeComparer.recur(TypeComparer.scala:1117)
	at dotty.tools.dotc.core.TypeComparer.isSubType(TypeComparer.scala:162)
	at dotty.tools.dotc.core.TypeComparer.isSubType(TypeComparer.scala:172)
	at dotty.tools.dotc.core.TypeComparer.topLevelSubType(TypeComparer.scala:129)
	at dotty.tools.dotc.core.Types$Type.$less$colon$less(Types.scala:900)
	at dotty.tools.dotc.transform.patmat.SpaceEngine.isSubType(Space.scala:475)
	at dotty.tools.dotc.transform.patmat.SpaceLogic.op$3(Space.scala:202)
	at dotty.tools.dotc.transform.patmat.SpaceLogic.intersect(Space.scala:224)
	at dotty.tools.dotc.transform.patmat.SpaceEngine.intersect(Space.scala:306)
	at dotty.tools.dotc.transform.patmat.SpaceLogic.op$11$$anonfun$3(Space.scala:194)
	at scala.collection.immutable.List.map(List.scala:219)
	at dotty.tools.dotc.transform.patmat.SpaceLogic.op$3(Space.scala:194)
	at dotty.tools.dotc.transform.patmat.SpaceLogic.intersect(Space.scala:224)
	at dotty.tools.dotc.transform.patmat.SpaceEngine.intersect(Space.scala:306)
	at dotty.tools.dotc.transform.patmat.SpaceLogic.op$18$$anonfun$4(Space.scala:261)
	at scala.collection.immutable.List.exists(List.scala:367)
	at dotty.tools.dotc.transform.patmat.SpaceLogic.op$4(Space.scala:261)
	at dotty.tools.dotc.transform.patmat.SpaceLogic.minus(Space.scala:270)
	at dotty.tools.dotc.transform.patmat.SpaceEngine.minus(Space.scala:306)
	at dotty.tools.dotc.transform.patmat.SpaceLogic.op$17$$anonfun$3(Space.scala:247)
	at scala.collection.immutable.List.map(List.scala:219)
	at dotty.tools.dotc.transform.patmat.SpaceLogic.op$4(Space.scala:247)
	at dotty.tools.dotc.transform.patmat.SpaceLogic.minus(Space.scala:270)
	at dotty.tools.dotc.transform.patmat.SpaceEngine.minus(Space.scala:306)
	at dotty.tools.dotc.transform.patmat.SpaceLogic.op$17$$anonfun$3(Space.scala:247)
	at scala.collection.immutable.List.map(List.scala:223)
	at dotty.tools.dotc.transform.patmat.SpaceLogic.op$4(Space.scala:247)
	at dotty.tools.dotc.transform.patmat.SpaceLogic.minus(Space.scala:270)
	at dotty.tools.dotc.transform.patmat.SpaceEngine.minus(Space.scala:306)
	at dotty.tools.dotc.transform.patmat.SpaceLogic.op$16$$anonfun$2(Space.scala:245)
	at scala.collection.LinearSeqOps.foldLeft(LinearSeq.scala:169)
	at scala.collection.LinearSeqOps.foldLeft$(LinearSeq.scala:165)
	at scala.collection.immutable.List.foldLeft(List.scala:79)
	at dotty.tools.dotc.transform.patmat.SpaceLogic.op$4(Space.scala:245)
	at dotty.tools.dotc.transform.patmat.SpaceLogic.minus(Space.scala:270)
	at dotty.tools.dotc.transform.patmat.SpaceEngine.minus(Space.scala:306)
	at dotty.tools.dotc.transform.patmat.SpaceLogic.op$16$$anonfun$2(Space.scala:245)
	at scala.collection.LinearSeqOps.foldLeft(LinearSeq.scala:169)
	at scala.collection.LinearSeqOps.foldLeft$(LinearSeq.scala:165)
	at scala.collection.immutable.List.foldLeft(List.scala:79)
	at dotty.tools.dotc.transform.patmat.SpaceLogic.op$4(Space.scala:245)
	at dotty.tools.dotc.transform.patmat.SpaceLogic.minus(Space.scala:270)
	at dotty.tools.dotc.transform.patmat.SpaceEngine.minus(Space.scala:306)
	at dotty.tools.dotc.transform.patmat.SpaceEngine.checkExhaustivity(Space.scala:784)
	at dotty.tools.dotc.transform.PatternMatcher.transformMatch(PatternMatcher.scala:45)
	at dotty.tools.dotc.transform.MegaPhase.goMatch(MegaPhase.scala:746)
	at dotty.tools.dotc.transform.MegaPhase.transformUnnamed$1(MegaPhase.scala:345)
	at dotty.tools.dotc.transform.MegaPhase.transformTree(MegaPhase.scala:396)
	at dotty.tools.dotc.transform.MegaPhase.mapDefDef$1(MegaPhase.scala:245)
	at dotty.tools.dotc.transform.MegaPhase.transformNamed$1(MegaPhase.scala:248)
	at dotty.tools.dotc.transform.MegaPhase.transformTree(MegaPhase.scala:394)
	at dotty.tools.dotc.transform.MegaPhase.transformStat$2(MegaPhase.scala:404)
	at dotty.tools.dotc.transform.MegaPhase.$anonfun$1(MegaPhase.scala:409)
	at scala.collection.immutable.List.mapConserve(List.scala:444)
	at dotty.tools.dotc.transform.MegaPhase.transformStats(MegaPhase.scala:409)
	at dotty.tools.dotc.transform.MegaPhase.transformUnnamed$1(MegaPhase.scala:339)
	at dotty.tools.dotc.transform.MegaPhase.transformTree(MegaPhase.scala:396)
	at dotty.tools.dotc.transform.MegaPhase.transformNamed$1(MegaPhase.scala:251)
	at dotty.tools.dotc.transform.MegaPhase.transformTree(MegaPhase.scala:394)
	at dotty.tools.dotc.transform.MegaPhase.transformStat$2(MegaPhase.scala:404)
	at dotty.tools.dotc.transform.MegaPhase.$anonfun$1(MegaPhase.scala:409)
	at scala.collection.immutable.List.mapConserve(List.scala:444)
	at dotty.tools.dotc.transform.MegaPhase.transformStats(MegaPhase.scala:409)
	at dotty.tools.dotc.transform.MegaPhase.mapPackage$1(MegaPhase.scala:356)
	at dotty.tools.dotc.transform.MegaPhase.transformUnnamed$1(MegaPhase.scala:359)
	at dotty.tools.dotc.transform.MegaPhase.transformTree(MegaPhase.scala:396)
	at dotty.tools.dotc.transform.MegaPhase.transformUnit(MegaPhase.scala:415)
	at dotty.tools.dotc.transform.MegaPhase.run(MegaPhase.scala:427)
	at dotty.tools.dotc.core.Phases$Phase.runOn$$anonfun$1(Phases.scala:315)
	at scala.collection.immutable.List.map(List.scala:219)
	at dotty.tools.dotc.core.Phases$Phase.runOn(Phases.scala:316)
	at dotty.tools.dotc.Run.runPhases$4$$anonfun$4(Run.scala:167)
	at dotty.runtime.function.JProcedure1.apply(JProcedure1.java:15)
	at dotty.runtime.function.JProcedure1.apply(JProcedure1.java:10)
	at scala.collection.ArrayOps$.foreach$extension(ArrayOps.scala:1323)
	at dotty.tools.dotc.Run.runPhases$5(Run.scala:177)
	at dotty.tools.dotc.Run.compileUnits$$anonfun$1(Run.scala:185)
	at dotty.runtime.function.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12)
	at dotty.tools.dotc.util.Stats$.maybeMonitored(Stats.scala:64)
	at dotty.tools.dotc.Run.compileUnits(Run.scala:192)
	at dotty.tools.dotc.Run.compileSources(Run.scala:129)
	at dotty.tools.dotc.Run.compile(Run.scala:112)
	at dotty.tools.dotc.Driver.doCompile(Driver.scala:36)
	at dotty.tools.dotc.Driver.process(Driver.scala:189)
	at dotty.tools.dotc.Driver.process(Driver.scala:158)
	at dotty.tools.dotc.Driver.process(Driver.scala:170)
	at dotty.tools.dotc.Driver.main(Driver.scala:197)
	at dotty.tools.dotc.Main.main(Main.scala)
@bishabosha bishabosha changed the title GADT multi wildcard crash at pruneErasedDefs irrefutable boolean extractor GADT crash at pruneErasedDefs (union of wildcards) Feb 15, 2020
nicolasstucki added a commit that referenced this issue Feb 17, 2020
Fix #8319: Survive bad parameters in compareCaptured
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant