Skip to content

crash when summon sum mirror of intersection type #15190

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 May 16, 2022 · 1 comment · Fixed by #15192
Closed

crash when summon sum mirror of intersection type #15190

bishabosha opened this issue May 16, 2022 · 1 comment · Fixed by #15192

Comments

@bishabosha
Copy link
Member

Compiler version

3.1.2

Minimized code

import scala.deriving.Mirror

trait Mixin

sealed trait Fruit extends Mixin
object Fruit {
  case object Apple extends Fruit
  case object Orange extends Fruit
}

@main def Test = {
  summon[Mirror.SumOf[Fruit & Mixin]]
}

Output (click arrow to expand)

Exception in thread "main" scala.MatchError: AndType(TypeRef(ThisType(TypeRef(NoPrefix,module class <empty>)),trait Fruit),TypeRef(ThisType(TypeRef(NoPrefix,module class <empty>)),trait Mixin)) (of class dotty.tools.dotc.core.Types$CachedAndType) while compiling /Users/jamie/workspace/dotty/local/foo/App.scala
scala.MatchError: AndType(TypeRef(ThisType(TypeRef(NoPrefix,module class <empty>)),trait Fruit),TypeRef(ThisType(TypeRef(NoPrefix,module class <empty>)),trait Mixin)) (of class dotty.tools.dotc.core.Types$CachedAndType)
	at dotty.tools.dotc.transform.TypeUtils$.companionRef(TypeUtils.scala:91)
	at dotty.tools.dotc.typer.Synthesizer.companionPath(Synthesizer.scala:208)
	at dotty.tools.dotc.typer.Synthesizer.sumMirror(Synthesizer.scala:327)
	at dotty.tools.dotc.typer.Synthesizer.$init$$$anonfun$6$$anonfun$1$$anonfun$1$$anonfun$1(Synthesizer.scala:352)
	at dotty.tools.dotc.typer.Synthesizer.makeMirror(Synthesizer.scala:338)
	at dotty.tools.dotc.typer.Synthesizer.$init$$$anonfun$6$$anonfun$1(Synthesizer.scala:352)
	at dotty.tools.dotc.typer.Synthesizer.recur$1(Synthesizer.scala:505)
	at dotty.tools.dotc.typer.Synthesizer.tryAll(Synthesizer.scala:510)
	at dotty.tools.dotc.typer.Implicits.inferImplicitArg(Implicits.scala:863)
	at dotty.tools.dotc.typer.Implicits.inferImplicitArg$(Implicits.scala:791)
	at dotty.tools.dotc.typer.Typer.inferImplicitArg(Typer.scala:119)
	at dotty.tools.dotc.typer.Typer.implicitArgs$1(Typer.scala:3428)
	at dotty.tools.dotc.typer.Typer.addImplicitArgs$1(Typer.scala:3464)
	at dotty.tools.dotc.typer.Typer.adaptNoArgsImplicitMethod$1(Typer.scala:3544)
	at dotty.tools.dotc.typer.Typer.adaptNoArgs$1(Typer.scala:3742)
	at dotty.tools.dotc.typer.Typer.adapt1(Typer.scala:3976)
	at dotty.tools.dotc.typer.Typer.adapt(Typer.scala:3306)
	at dotty.tools.dotc.typer.Typer.typed(Typer.scala:2937)
	at dotty.tools.dotc.typer.Typer.typed(Typer.scala:2941)
	at dotty.tools.dotc.typer.Typer.typedExpr(Typer.scala:3057)
	at dotty.tools.dotc.typer.Typer.typedBlock(Typer.scala:1075)
	at dotty.tools.dotc.typer.Typer.typedUnnamed$1(Typer.scala:2817)
	at dotty.tools.dotc.typer.Typer.typedUnadapted(Typer.scala:2872)
	at dotty.tools.dotc.typer.Typer.typed(Typer.scala:2937)
	at dotty.tools.dotc.typer.Typer.typed(Typer.scala:2941)
	at dotty.tools.dotc.typer.Typer.typedExpr(Typer.scala:3057)
	at dotty.tools.dotc.typer.Namer.typedAheadExpr$$anonfun$1(Namer.scala:1473)
	at dotty.tools.dotc.typer.Namer.typedAhead(Namer.scala:1463)
	at dotty.tools.dotc.typer.Namer.typedAheadExpr(Namer.scala:1473)
	at dotty.tools.dotc.typer.Namer.typedAheadRhs$1$$anonfun$1(Namer.scala:1710)
	at dotty.tools.dotc.typer.PrepareInlineable$.dropInlineIfError(PrepareInlineable.scala:238)
	at dotty.tools.dotc.typer.Namer.typedAheadRhs$1(Namer.scala:1710)
	at dotty.tools.dotc.typer.Namer.rhsType$1(Namer.scala:1718)
	at dotty.tools.dotc.typer.Namer.cookedRhsType$1(Namer.scala:1736)
	at dotty.tools.dotc.typer.Namer.lhsType$1(Namer.scala:1737)
	at dotty.tools.dotc.typer.Namer.inferredResultType(Namer.scala:1748)
	at dotty.tools.dotc.typer.Namer.inferredType$1(Namer.scala:1512)
	at dotty.tools.dotc.typer.Namer.valOrDefDefSig(Namer.scala:1519)
	at dotty.tools.dotc.typer.Namer.defDefSig(Namer.scala:1588)
	at dotty.tools.dotc.typer.Namer$Completer.typeSig(Namer.scala:782)
	at dotty.tools.dotc.typer.Namer$Completer.completeInCreationContext(Namer.scala:914)
	at dotty.tools.dotc.typer.Namer$Completer.complete(Namer.scala:806)
	at dotty.tools.dotc.core.SymDenotations$SymDenotation.completeFrom(SymDenotations.scala:168)
	at dotty.tools.dotc.core.Denotations$Denotation.completeInfo$1(Denotations.scala:188)
	at dotty.tools.dotc.core.Denotations$Denotation.info(Denotations.scala:190)
	at dotty.tools.dotc.core.SymDenotations$SymDenotation.ensureCompleted(SymDenotations.scala:370)
	at dotty.tools.dotc.typer.Typer.retrieveSym(Typer.scala:2751)
	at dotty.tools.dotc.typer.Typer.typedNamed$1(Typer.scala:2776)
	at dotty.tools.dotc.typer.Typer.typedUnadapted(Typer.scala:2871)
	at dotty.tools.dotc.typer.Typer.typed(Typer.scala:2937)
	at dotty.tools.dotc.typer.Typer.typed(Typer.scala:2941)
	at dotty.tools.dotc.typer.Typer.traverse$1(Typer.scala:2963)
	at dotty.tools.dotc.typer.Typer.typedStats(Typer.scala:3013)
	at dotty.tools.dotc.typer.Typer.typedClassDef(Typer.scala:2454)
	at dotty.tools.dotc.typer.Typer.typedTypeOrClassDef$1(Typer.scala:2797)
	at dotty.tools.dotc.typer.Typer.typedNamed$1(Typer.scala:2801)
	at dotty.tools.dotc.typer.Typer.typedUnadapted(Typer.scala:2871)
	at dotty.tools.dotc.typer.Typer.typed(Typer.scala:2937)
	at dotty.tools.dotc.typer.Typer.typed(Typer.scala:2941)
	at dotty.tools.dotc.typer.Typer.traverse$1(Typer.scala:2963)
	at dotty.tools.dotc.typer.Typer.typedStats(Typer.scala:3013)
	at dotty.tools.dotc.typer.Typer.typedPackageDef(Typer.scala:2581)
	at dotty.tools.dotc.typer.Typer.typedUnnamed$1(Typer.scala:2842)
	at dotty.tools.dotc.typer.Typer.typedUnadapted(Typer.scala:2872)
	at dotty.tools.dotc.typer.Typer.typed(Typer.scala:2937)
	at dotty.tools.dotc.typer.Typer.typed(Typer.scala:2941)
	at dotty.tools.dotc.typer.Typer.typedExpr(Typer.scala:3057)
	at dotty.tools.dotc.typer.TyperPhase.typeCheck$$anonfun$1(TyperPhase.scala:47)
	at dotty.tools.dotc.core.Phases$Phase.monitor(Phases.scala:411)
	at dotty.tools.dotc.typer.TyperPhase.typeCheck(TyperPhase.scala:54)
	at dotty.tools.dotc.typer.TyperPhase.runOn$$anonfun$3(TyperPhase.scala:88)
	at scala.runtime.function.JProcedure1.apply(JProcedure1.java:15)
	at scala.runtime.function.JProcedure1.apply(JProcedure1.java:10)
	at scala.collection.immutable.List.foreach(List.scala:333)
	at dotty.tools.dotc.typer.TyperPhase.runOn(TyperPhase.scala:88)
	at dotty.tools.dotc.Run.runPhases$1$$anonfun$1(Run.scala:259)
	at scala.runtime.function.JProcedure1.apply(JProcedure1.java:15)
	at scala.runtime.function.JProcedure1.apply(JProcedure1.java:10)
	at scala.collection.ArrayOps$.foreach$extension(ArrayOps.scala:1328)
	at dotty.tools.dotc.Run.runPhases$1(Run.scala:270)
	at dotty.tools.dotc.Run.compileUnits$$anonfun$1(Run.scala:278)
	at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.scala:18)
	at dotty.tools.dotc.util.Stats$.maybeMonitored(Stats.scala:68)
	at dotty.tools.dotc.Run.compileUnits(Run.scala:287)
	at dotty.tools.dotc.Run.compileSources(Run.scala:220)
	at dotty.tools.dotc.Run.compile(Run.scala:204)
	at dotty.tools.dotc.Driver.doCompile(Driver.scala:39)
	at dotty.tools.dotc.Driver.process(Driver.scala:199)
	at dotty.tools.dotc.Driver.process(Driver.scala:167)
	at dotty.tools.dotc.Driver.process(Driver.scala:179)
	at dotty.tools.dotc.Driver.main(Driver.scala:209)
	at dotty.tools.dotc.Main.main(Main.scala)
@bishabosha
Copy link
Member Author

hard to know what to do in this case, in the case of product types then one part of the intersection is chosen to be the mirror, so there is no intersection in the companion path, but in the case of sum types then one part of the intersection is known to be a subclass of the other, so in mirrorCompanionRef we can take advantage of that.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants