package playground
import cats.Show
object Usernames {
opaque type Username = String
object Username {
def apply(s: String): Username = s
given Show[Username] {
def show(u: Username) = u
}
}
}
Run using:
package playground
import cats.implicits.{given _}
import cats.Show
import Usernames._
object Main {
def main(args: Array[String]): Unit = {
val u: Username = Username("tim")
println(u.show)
println("Hello world!")
println(msg)
}
def msg = "I was compiled by dotty :)"
}
[info] loading settings for project root from build.sbt ...
[info] set current project to dotty-simple (in build file:/Users/tim/dev/dotty-issue/)
[info] running playground.Main
tim
Hello world!
I was compiled by dotty :)
[success] Total time: 1 s, completed 27 Jul 2020, 15:37:52
As expected. HOWEVER, I get the following when inspecting the tasty file generated:
dotc -decompile target/scala-0.26/classes/playground/Usernames.tasty
java.lang.AssertionError: assertion failed: module class given_Show_Username$ has non-class parent: AppliedType(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),module cats),Show),List(TypeRef(ThisType(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),module playground),module class Usernames$)),type Username)))
at dotty.DottyPredef$.assertFail(DottyPredef.scala:17)
at dotty.tools.dotc.core.SymDenotations$ClassDenotation.traverse$1(SymDenotations.scala:1740)
at dotty.tools.dotc.core.SymDenotations$ClassDenotation.computeBaseData(SymDenotations.scala:1745)
at dotty.tools.dotc.core.SymDenotations$BaseDataImpl.apply(SymDenotations.scala:2658)
at dotty.tools.dotc.core.SymDenotations$ClassDenotation.baseData(SymDenotations.scala:1717)
at dotty.tools.dotc.core.SymDenotations$ClassDenotation.baseClassSet(SymDenotations.scala:1728)
at dotty.tools.dotc.core.SymDenotations$ClassDenotation.derivesFrom(SymDenotations.scala:1753)
at dotty.tools.dotc.core.SymDenotations$SymDenotation.isValueClass(SymDenotations.scala:759)
at dotty.tools.dotc.transform.ValueClasses$.isDerivedValueClass(ValueClasses.scala:20)
at dotty.tools.dotc.core.TypeErasure.dotty$tools$dotc$core$TypeErasure$$sigName(TypeErasure.scala:602)
at dotty.tools.dotc.core.TypeErasure$.sigName(TypeErasure.scala:161)
at dotty.tools.dotc.core.Signature$.apply(Signature.scala:169)
at dotty.tools.dotc.core.Types$MethodicType.resultSignature(Types.scala:3086)
at dotty.tools.dotc.core.Types$MethodicType.resultSignature$(Types.scala:3081)
at dotty.tools.dotc.core.Types$MethodOrPoly.resultSignature(Types.scala:3207)
at dotty.tools.dotc.core.Types$MethodType.computeSignature(Types.scala:3365)
at dotty.tools.dotc.core.Types$SignatureCachingType.signature(Types.scala:3074)
at dotty.tools.dotc.core.Types$SignatureCachingType.signature$(Types.scala:3066)
at dotty.tools.dotc.core.Types$MethodOrPoly.signature(Types.scala:3207)
at dotty.tools.dotc.core.Denotations$SingleDenotation.signature(Denotations.scala:586)
at dotty.tools.dotc.core.Denotations$SingleDenotation.atSignature(Denotations.scala:618)
at dotty.tools.dotc.core.Denotations$SingleDenotation.atSignature(Denotations.scala:616)
at dotty.tools.dotc.core.tasty.TreeUnpickler.dotty$tools$dotc$core$tasty$TreeUnpickler$TreeReader$$_$accessibleDenot$1(TreeUnpickler.scala:1067)
at dotty.tools.dotc.core.tasty.TreeUnpickler$TreeReader.completeSelect$1(TreeUnpickler.scala:1058)
at dotty.tools.dotc.core.tasty.TreeUnpickler$TreeReader.readSimpleTerm$1(TreeUnpickler.scala:1081)
at dotty.tools.dotc.core.tasty.TreeUnpickler$TreeReader.readTerm(TreeUnpickler.scala:1251)
at dotty.tools.dotc.core.tasty.TreeUnpickler$TreeReader.readLengthTerm$1(TreeUnpickler.scala:1113)
at dotty.tools.dotc.core.tasty.TreeUnpickler$TreeReader.readTerm(TreeUnpickler.scala:1251)
at dotty.tools.dotc.core.tasty.TreeUnpickler.readRhs$2$$anonfun$2$$anonfun$1(TreeUnpickler.scala:793)
at dotty.tools.dotc.core.tasty.TreeUnpickler$LazyReader.complete(TreeUnpickler.scala:1383)
at dotty.tools.dotc.ast.Trees$WithLazyField.forceIfLazy(Trees.scala:919)
at dotty.tools.dotc.ast.Trees$WithLazyField.forceIfLazy$(Trees.scala:914)
at dotty.tools.dotc.ast.Trees$ValOrDefDef.forceIfLazy(Trees.scala:385)
at dotty.tools.dotc.ast.Trees$ValOrDefDef.rhs(Trees.scala:390)
at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.foldOver(Trees.scala:1470)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.traverseChildren(Trees.scala:1510)
at dotty.tools.dotc.CompilationUnit$Force.traverse(CompilationUnit.scala:123)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1509)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1509)
at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.apply$$anonfun$1(Trees.scala:1387)
at scala.collection.LinearSeqOps.foldLeft(LinearSeq.scala:168)
at scala.collection.LinearSeqOps.foldLeft$(LinearSeq.scala:164)
at scala.collection.immutable.List.foldLeft(List.scala:79)
at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.apply(Trees.scala:1387)
at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.foldOver(Trees.scala:1481)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.traverseChildren(Trees.scala:1510)
at dotty.tools.dotc.CompilationUnit$Force.traverse(CompilationUnit.scala:123)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1509)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1509)
at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.foldOver(Trees.scala:1478)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.traverseChildren(Trees.scala:1510)
at dotty.tools.dotc.CompilationUnit$Force.traverse(CompilationUnit.scala:123)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1509)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1509)
at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.apply$$anonfun$1(Trees.scala:1387)
at scala.collection.LinearSeqOps.foldLeft(LinearSeq.scala:168)
at scala.collection.LinearSeqOps.foldLeft$(LinearSeq.scala:164)
at scala.collection.immutable.List.foldLeft(List.scala:79)
at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.apply(Trees.scala:1387)
at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.foldOver(Trees.scala:1481)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.traverseChildren(Trees.scala:1510)
at dotty.tools.dotc.CompilationUnit$Force.traverse(CompilationUnit.scala:123)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1509)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1509)
at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.foldOver(Trees.scala:1478)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.traverseChildren(Trees.scala:1510)
at dotty.tools.dotc.CompilationUnit$Force.traverse(CompilationUnit.scala:123)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1509)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1509)
at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.apply$$anonfun$1(Trees.scala:1387)
at scala.collection.LinearSeqOps.foldLeft(LinearSeq.scala:168)
at scala.collection.LinearSeqOps.foldLeft$(LinearSeq.scala:164)
at scala.collection.immutable.List.foldLeft(List.scala:79)
at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.apply(Trees.scala:1387)
at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.foldOver(Trees.scala:1485)
at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.foldOver(Trees.scala:1390)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.traverseChildren(Trees.scala:1510)
at dotty.tools.dotc.CompilationUnit$Force.traverse(CompilationUnit.scala:123)
at dotty.tools.dotc.CompilationUnit$.apply(CompilationUnit.scala:92)
at dotty.tools.dotc.CompilationUnit$.apply(CompilationUnit.scala:83)
at dotty.tools.dotc.fromtasty.ReadTasty.compilationUnit$1(ReadTasty.scala:42)
at dotty.tools.dotc.fromtasty.ReadTasty.readTASTY(ReadTasty.scala:71)
at dotty.tools.dotc.fromtasty.ReadTasty.runOn$$anonfun$1(ReadTasty.scala:25)
at scala.collection.immutable.List.flatMap(List.scala:293)
at dotty.tools.dotc.fromtasty.ReadTasty.runOn(ReadTasty.scala:25)
at dotty.tools.dotc.Run.runPhases$4$$anonfun$4(Run.scala:181)
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:191)
at dotty.tools.dotc.Run.compileUnits$$anonfun$1(Run.scala:199)
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:206)
at dotty.tools.dotc.Run.compileUnits(Run.scala:148)
at dotty.tools.dotc.fromtasty.TASTYRun.compile(TASTYRun.scala:10)
at dotty.tools.dotc.Driver.doCompile(Driver.scala:38)
at dotty.tools.dotc.Driver.process(Driver.scala:195)
at dotty.tools.dotc.Driver.process(Driver.scala:164)
at dotty.tools.dotc.Driver.process(Driver.scala:176)
at dotty.tools.dotc.Driver.main(Driver.scala:203)
at dotty.tools.dotc.decompiler.Main.main(Main.scala)
no sig for TypeRef(ThisType(TypeRef(ThisType(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),module playground),module class Usernames$)),module class Username$)),module class given_Show_Username$) because of ()
failure while taking result signature of (): playground.Usernames.Username.given_Show_Username$: playground.Usernames.Username.given_Show_Username$
cannot take signature of (): playground.Usernames.Username.given_Show_Username$
java.lang.AssertionError: assertion failed: module class given_Show_Username$ has non-class parent: AppliedType(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),module cats),Show),List(TypeRef(ThisType(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),module playground),module class Usernames$)),type Username))) while compiling playground.Usernames
Exception in thread "main" java.lang.AssertionError: assertion failed: module class given_Show_Username$ has non-class parent: AppliedType(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),module cats),Show),List(TypeRef(ThisType(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),module playground),module class Usernames$)),type Username)))
at dotty.DottyPredef$.assertFail(DottyPredef.scala:17)
at dotty.tools.dotc.core.SymDenotations$ClassDenotation.traverse$1(SymDenotations.scala:1740)
at dotty.tools.dotc.core.SymDenotations$ClassDenotation.computeBaseData(SymDenotations.scala:1745)
at dotty.tools.dotc.core.SymDenotations$BaseDataImpl.apply(SymDenotations.scala:2658)
at dotty.tools.dotc.core.SymDenotations$ClassDenotation.baseData(SymDenotations.scala:1717)
at dotty.tools.dotc.core.SymDenotations$ClassDenotation.baseClassSet(SymDenotations.scala:1728)
at dotty.tools.dotc.core.SymDenotations$ClassDenotation.derivesFrom(SymDenotations.scala:1753)
at dotty.tools.dotc.core.SymDenotations$SymDenotation.isValueClass(SymDenotations.scala:759)
at dotty.tools.dotc.transform.ValueClasses$.isDerivedValueClass(ValueClasses.scala:20)
at dotty.tools.dotc.core.TypeErasure.dotty$tools$dotc$core$TypeErasure$$sigName(TypeErasure.scala:602)
at dotty.tools.dotc.core.TypeErasure$.sigName(TypeErasure.scala:161)
at dotty.tools.dotc.core.Signature$.apply(Signature.scala:169)
at dotty.tools.dotc.core.Types$MethodicType.resultSignature(Types.scala:3086)
at dotty.tools.dotc.core.Types$MethodicType.resultSignature$(Types.scala:3081)
at dotty.tools.dotc.core.Types$MethodOrPoly.resultSignature(Types.scala:3207)
at dotty.tools.dotc.core.Types$MethodType.computeSignature(Types.scala:3365)
at dotty.tools.dotc.core.Types$SignatureCachingType.signature(Types.scala:3074)
at dotty.tools.dotc.core.Types$SignatureCachingType.signature$(Types.scala:3066)
at dotty.tools.dotc.core.Types$MethodOrPoly.signature(Types.scala:3207)
at dotty.tools.dotc.core.Denotations$SingleDenotation.signature(Denotations.scala:586)
at dotty.tools.dotc.core.Denotations$SingleDenotation.atSignature(Denotations.scala:618)
at dotty.tools.dotc.core.Denotations$SingleDenotation.atSignature(Denotations.scala:616)
at dotty.tools.dotc.core.tasty.TreeUnpickler.dotty$tools$dotc$core$tasty$TreeUnpickler$TreeReader$$_$accessibleDenot$1(TreeUnpickler.scala:1067)
at dotty.tools.dotc.core.tasty.TreeUnpickler$TreeReader.completeSelect$1(TreeUnpickler.scala:1058)
at dotty.tools.dotc.core.tasty.TreeUnpickler$TreeReader.readSimpleTerm$1(TreeUnpickler.scala:1081)
at dotty.tools.dotc.core.tasty.TreeUnpickler$TreeReader.readTerm(TreeUnpickler.scala:1251)
at dotty.tools.dotc.core.tasty.TreeUnpickler$TreeReader.readLengthTerm$1(TreeUnpickler.scala:1113)
at dotty.tools.dotc.core.tasty.TreeUnpickler$TreeReader.readTerm(TreeUnpickler.scala:1251)
at dotty.tools.dotc.core.tasty.TreeUnpickler.readRhs$2$$anonfun$2$$anonfun$1(TreeUnpickler.scala:793)
at dotty.tools.dotc.core.tasty.TreeUnpickler$LazyReader.complete(TreeUnpickler.scala:1383)
at dotty.tools.dotc.ast.Trees$WithLazyField.forceIfLazy(Trees.scala:919)
at dotty.tools.dotc.ast.Trees$WithLazyField.forceIfLazy$(Trees.scala:914)
at dotty.tools.dotc.ast.Trees$ValOrDefDef.forceIfLazy(Trees.scala:385)
at dotty.tools.dotc.ast.Trees$ValOrDefDef.rhs(Trees.scala:390)
at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.foldOver(Trees.scala:1470)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.traverseChildren(Trees.scala:1510)
at dotty.tools.dotc.CompilationUnit$Force.traverse(CompilationUnit.scala:123)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1509)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1509)
at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.apply$$anonfun$1(Trees.scala:1387)
at scala.collection.LinearSeqOps.foldLeft(LinearSeq.scala:168)
at scala.collection.LinearSeqOps.foldLeft$(LinearSeq.scala:164)
at scala.collection.immutable.List.foldLeft(List.scala:79)
at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.apply(Trees.scala:1387)
at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.foldOver(Trees.scala:1481)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.traverseChildren(Trees.scala:1510)
at dotty.tools.dotc.CompilationUnit$Force.traverse(CompilationUnit.scala:123)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1509)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1509)
at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.foldOver(Trees.scala:1478)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.traverseChildren(Trees.scala:1510)
at dotty.tools.dotc.CompilationUnit$Force.traverse(CompilationUnit.scala:123)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1509)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1509)
at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.apply$$anonfun$1(Trees.scala:1387)
at scala.collection.LinearSeqOps.foldLeft(LinearSeq.scala:168)
at scala.collection.LinearSeqOps.foldLeft$(LinearSeq.scala:164)
at scala.collection.immutable.List.foldLeft(List.scala:79)
at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.apply(Trees.scala:1387)
at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.foldOver(Trees.scala:1481)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.traverseChildren(Trees.scala:1510)
at dotty.tools.dotc.CompilationUnit$Force.traverse(CompilationUnit.scala:123)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1509)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1509)
at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.foldOver(Trees.scala:1478)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.traverseChildren(Trees.scala:1510)
at dotty.tools.dotc.CompilationUnit$Force.traverse(CompilationUnit.scala:123)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1509)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1509)
at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.apply$$anonfun$1(Trees.scala:1387)
at scala.collection.LinearSeqOps.foldLeft(LinearSeq.scala:168)
at scala.collection.LinearSeqOps.foldLeft$(LinearSeq.scala:164)
at scala.collection.immutable.List.foldLeft(List.scala:79)
at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.apply(Trees.scala:1387)
at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.foldOver(Trees.scala:1485)
at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.foldOver(Trees.scala:1390)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.traverseChildren(Trees.scala:1510)
at dotty.tools.dotc.CompilationUnit$Force.traverse(CompilationUnit.scala:123)
at dotty.tools.dotc.CompilationUnit$.apply(CompilationUnit.scala:92)
at dotty.tools.dotc.CompilationUnit$.apply(CompilationUnit.scala:83)
at dotty.tools.dotc.fromtasty.ReadTasty.compilationUnit$1(ReadTasty.scala:42)
at dotty.tools.dotc.fromtasty.ReadTasty.readTASTY(ReadTasty.scala:71)
at dotty.tools.dotc.fromtasty.ReadTasty.runOn$$anonfun$1(ReadTasty.scala:25)
at scala.collection.immutable.List.flatMap(List.scala:293)
at dotty.tools.dotc.fromtasty.ReadTasty.runOn(ReadTasty.scala:25)
at dotty.tools.dotc.Run.runPhases$4$$anonfun$4(Run.scala:181)
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:191)
at dotty.tools.dotc.Run.compileUnits$$anonfun$1(Run.scala:199)
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:206)
at dotty.tools.dotc.Run.compileUnits(Run.scala:148)
at dotty.tools.dotc.fromtasty.TASTYRun.compile(TASTYRun.scala:10)
at dotty.tools.dotc.Driver.doCompile(Driver.scala:38)
at dotty.tools.dotc.Driver.process(Driver.scala:195)
at dotty.tools.dotc.Driver.process(Driver.scala:164)
at dotty.tools.dotc.Driver.process(Driver.scala:176)
at dotty.tools.dotc.Driver.main(Driver.scala:203)
at dotty.tools.dotc.decompiler.Main.main(Main.scala)
Can we reproduce it without the cats dependency?
@nicolasstucki I haven't had much time to look into yet this but I did try defining my own Show typeclass and couldn't reproduce.
Here's a reproducer without the cats dependency.
It seems that the issue is only triggered if the typeclass is defined in a separate artifact, so I just built a simple library:
//src/dotty-issues/i9446/shower$ cat src/main/scala/shower/Show.scala
package shower
trait Show[T] {
def show(x: T): String
}
//src/dotty-issues/i9446/shower$ cat build.sbt
scalaVersion := "0.28.0-bin-20200925-f4528ce-NIGHTLY"
name := "shower"
organization := "io.grigg"
version := "1.0"
//src/dotty-issues/i9446/shower$ sbt publishLocal
then referred to it in the testcase:
//src/dotty-issues/i9446/repro$ cat src/main/scala/Test.scala
import shower.Show
object Test {
class T
object T {
given Show[T] {
def show(x: T) = ""
}
}
}
//src/dotty-issues/i9446/repro$ cat build.sbt
scalaVersion := "0.28.0-bin-20200925-f4528ce-NIGHTLY"
name := "i9446"
version := "0.1.0"
libraryDependencies += ("io.grigg" %% "shower" % "1.0")
//src/dotty-issues/i9446/repro$ sbt compile
and watched it go boom:
/src/dotty-issues/i9446/repro$ dotc -version
Dotty compiler version 0.28.0-bin-SNAPSHOT-git-f4528ce -- Copyright 2002-2020, LAMP/EPFL
/src/dotty-issues/i9446/repro$ dotc -decompile target/scala-0.28/classes/Test.tasty
Output -- click to expand
java.lang.AssertionError: assertion failed: module class given_Show_T$ has non-class parent: AppliedType(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),module shower),Show),List(TypeRef(ThisType(TypeRef(ThisType(TypeRef(ThisType(TypeRef(NoPrefix,module class <root>)),module class <empty>)),module class Test$)),class T)))
at dotty.DottyPredef$.assertFail(DottyPredef.scala:17)
at dotty.tools.dotc.core.SymDenotations$ClassDenotation.traverse$1(SymDenotations.scala:1763)
at dotty.tools.dotc.core.SymDenotations$ClassDenotation.computeBaseData(SymDenotations.scala:1768)
at dotty.tools.dotc.core.SymDenotations$BaseDataImpl.apply(SymDenotations.scala:2693)
at dotty.tools.dotc.core.SymDenotations$ClassDenotation.baseData(SymDenotations.scala:1740)
at dotty.tools.dotc.core.SymDenotations$ClassDenotation.baseClassSet(SymDenotations.scala:1751)
at dotty.tools.dotc.core.SymDenotations$ClassDenotation.derivesFrom(SymDenotations.scala:1776)
at dotty.tools.dotc.core.SymDenotations$SymDenotation.isValueClass(SymDenotations.scala:778)
at dotty.tools.dotc.transform.ValueClasses$.isDerivedValueClass(ValueClasses.scala:20)
at dotty.tools.dotc.core.TypeErasure.dotty$tools$dotc$core$TypeErasure$$sigName(TypeErasure.scala:604)
at dotty.tools.dotc.core.TypeErasure$.sigName(TypeErasure.scala:161)
at dotty.tools.dotc.core.Signature$.apply(Signature.scala:169)
at dotty.tools.dotc.core.Types$MethodicType.resultSignature(Types.scala:3120)
at dotty.tools.dotc.core.Types$MethodicType.resultSignature$(Types.scala:3115)
at dotty.tools.dotc.core.Types$MethodOrPoly.resultSignature(Types.scala:3251)
at dotty.tools.dotc.core.Types$MethodType.computeSignature(Types.scala:3413)
at dotty.tools.dotc.core.Types$SignatureCachingType.signature(Types.scala:3108)
at dotty.tools.dotc.core.Types$SignatureCachingType.signature$(Types.scala:3100)
at dotty.tools.dotc.core.Types$MethodOrPoly.signature(Types.scala:3251)
at dotty.tools.dotc.core.Denotations$SingleDenotation.signature(Denotations.scala:583)
at dotty.tools.dotc.core.Denotations$SingleDenotation.atSignature(Denotations.scala:615)
at dotty.tools.dotc.core.Denotations$SingleDenotation.atSignature(Denotations.scala:613)
at dotty.tools.dotc.core.tasty.TreeUnpickler.dotty$tools$dotc$core$tasty$TreeUnpickler$TreeReader$$_$accessibleDenot$1(TreeUnpickler.scala:1066)
at dotty.tools.dotc.core.tasty.TreeUnpickler$TreeReader.completeSelect$1(TreeUnpickler.scala:1057)
at dotty.tools.dotc.core.tasty.TreeUnpickler$TreeReader.readSimpleTerm$1(TreeUnpickler.scala:1080)
at dotty.tools.dotc.core.tasty.TreeUnpickler$TreeReader.readTerm(TreeUnpickler.scala:1250)
at dotty.tools.dotc.core.tasty.TreeUnpickler$TreeReader.readLengthTerm$1(TreeUnpickler.scala:1112)
at dotty.tools.dotc.core.tasty.TreeUnpickler$TreeReader.readTerm(TreeUnpickler.scala:1250)
at dotty.tools.dotc.core.tasty.TreeUnpickler.readRhs$2$$anonfun$2$$anonfun$1(TreeUnpickler.scala:792)
at dotty.tools.dotc.core.tasty.TreeUnpickler$LazyReader.complete(TreeUnpickler.scala:1382)
at dotty.tools.dotc.ast.Trees$WithLazyField.forceIfLazy(Trees.scala:915)
at dotty.tools.dotc.ast.Trees$WithLazyField.forceIfLazy$(Trees.scala:910)
at dotty.tools.dotc.ast.Trees$ValOrDefDef.forceIfLazy(Trees.scala:377)
at dotty.tools.dotc.ast.Trees$ValOrDefDef.rhs(Trees.scala:382)
at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.foldOver(Trees.scala:1471)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.traverseChildren(Trees.scala:1511)
at dotty.tools.dotc.CompilationUnit$Force.traverse(CompilationUnit.scala:123)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1510)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1510)
at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.fold$1(Trees.scala:1385)
at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.apply(Trees.scala:1387)
at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.foldOver(Trees.scala:1482)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.traverseChildren(Trees.scala:1511)
at dotty.tools.dotc.CompilationUnit$Force.traverse(CompilationUnit.scala:123)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1510)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1510)
at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.foldOver(Trees.scala:1479)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.traverseChildren(Trees.scala:1511)
at dotty.tools.dotc.CompilationUnit$Force.traverse(CompilationUnit.scala:123)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1510)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1510)
at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.fold$1(Trees.scala:1385)
at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.apply(Trees.scala:1387)
at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.foldOver(Trees.scala:1482)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.traverseChildren(Trees.scala:1511)
at dotty.tools.dotc.CompilationUnit$Force.traverse(CompilationUnit.scala:123)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1510)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1510)
at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.foldOver(Trees.scala:1479)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.traverseChildren(Trees.scala:1511)
at dotty.tools.dotc.CompilationUnit$Force.traverse(CompilationUnit.scala:123)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1510)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1510)
at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.fold$1(Trees.scala:1385)
at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.apply(Trees.scala:1387)
at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.foldOver(Trees.scala:1486)
at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.foldOver(Trees.scala:1391)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.traverseChildren(Trees.scala:1511)
at dotty.tools.dotc.CompilationUnit$Force.traverse(CompilationUnit.scala:123)
at dotty.tools.dotc.CompilationUnit$.apply(CompilationUnit.scala:92)
at dotty.tools.dotc.CompilationUnit$.apply(CompilationUnit.scala:83)
at dotty.tools.dotc.fromtasty.ReadTasty.compilationUnit$1(ReadTasty.scala:42)
at dotty.tools.dotc.fromtasty.ReadTasty.readTASTY(ReadTasty.scala:71)
at dotty.tools.dotc.fromtasty.ReadTasty.runOn$$anonfun$1(ReadTasty.scala:25)
at scala.collection.immutable.List.flatMap(List.scala:293)
at dotty.tools.dotc.fromtasty.ReadTasty.runOn(ReadTasty.scala:25)
at dotty.tools.dotc.Run.runPhases$4$$anonfun$4(Run.scala:185)
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:195)
at dotty.tools.dotc.Run.compileUnits$$anonfun$1(Run.scala:203)
at dotty.runtime.function.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12)
at dotty.tools.dotc.util.Stats$.maybeMonitored(Stats.scala:63)
at dotty.tools.dotc.Run.compileUnits(Run.scala:210)
at dotty.tools.dotc.Run.compileUnits(Run.scala:152)
at dotty.tools.dotc.fromtasty.TASTYRun.compile(TASTYRun.scala:10)
at dotty.tools.dotc.Driver.doCompile(Driver.scala:38)
at dotty.tools.dotc.Driver.process(Driver.scala:195)
at dotty.tools.dotc.Driver.process(Driver.scala:164)
at dotty.tools.dotc.Driver.process(Driver.scala:176)
at dotty.tools.dotc.Driver.main(Driver.scala:203)
at dotty.tools.dotc.decompiler.Main.main(Main.scala)
no sig for TypeRef(ThisType(TypeRef(ThisType(TypeRef(ThisType(TypeRef(NoPrefix,module class <empty>)),module class Test$)),module class T$)),module class given_Show_T$) because of ()
failure while taking result signature of (): Test.T.given_Show_T$: Test.T.given_Show_T$
cannot take signature of (): Test.T.given_Show_T$
java.lang.AssertionError: assertion failed: module class given_Show_T$ has non-class parent: AppliedType(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),module shower),Show),List(TypeRef(ThisType(TypeRef(ThisType(TypeRef(ThisType(TypeRef(NoPrefix,module class <root>)),module class <empty>)),module class Test$)),class T))) while compiling Test
Exception in thread "main" java.lang.AssertionError: assertion failed: module class given_Show_T$ has non-class parent: AppliedType(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),module shower),Show),List(TypeRef(ThisType(TypeRef(ThisType(TypeRef(ThisType(TypeRef(NoPrefix,module class <root>)),module class <empty>)),module class Test$)),class T)))
at dotty.DottyPredef$.assertFail(DottyPredef.scala:17)
at dotty.tools.dotc.core.SymDenotations$ClassDenotation.traverse$1(SymDenotations.scala:1763)
at dotty.tools.dotc.core.SymDenotations$ClassDenotation.computeBaseData(SymDenotations.scala:1768)
at dotty.tools.dotc.core.SymDenotations$BaseDataImpl.apply(SymDenotations.scala:2693)
at dotty.tools.dotc.core.SymDenotations$ClassDenotation.baseData(SymDenotations.scala:1740)
at dotty.tools.dotc.core.SymDenotations$ClassDenotation.baseClassSet(SymDenotations.scala:1751)
at dotty.tools.dotc.core.SymDenotations$ClassDenotation.derivesFrom(SymDenotations.scala:1776)
at dotty.tools.dotc.core.SymDenotations$SymDenotation.isValueClass(SymDenotations.scala:778)
at dotty.tools.dotc.transform.ValueClasses$.isDerivedValueClass(ValueClasses.scala:20)
at dotty.tools.dotc.core.TypeErasure.dotty$tools$dotc$core$TypeErasure$$sigName(TypeErasure.scala:604)
at dotty.tools.dotc.core.TypeErasure$.sigName(TypeErasure.scala:161)
at dotty.tools.dotc.core.Signature$.apply(Signature.scala:169)
at dotty.tools.dotc.core.Types$MethodicType.resultSignature(Types.scala:3120)
at dotty.tools.dotc.core.Types$MethodicType.resultSignature$(Types.scala:3115)
at dotty.tools.dotc.core.Types$MethodOrPoly.resultSignature(Types.scala:3251)
at dotty.tools.dotc.core.Types$MethodType.computeSignature(Types.scala:3413)
at dotty.tools.dotc.core.Types$SignatureCachingType.signature(Types.scala:3108)
at dotty.tools.dotc.core.Types$SignatureCachingType.signature$(Types.scala:3100)
at dotty.tools.dotc.core.Types$MethodOrPoly.signature(Types.scala:3251)
at dotty.tools.dotc.core.Denotations$SingleDenotation.signature(Denotations.scala:583)
at dotty.tools.dotc.core.Denotations$SingleDenotation.atSignature(Denotations.scala:615)
at dotty.tools.dotc.core.Denotations$SingleDenotation.atSignature(Denotations.scala:613)
at dotty.tools.dotc.core.tasty.TreeUnpickler.dotty$tools$dotc$core$tasty$TreeUnpickler$TreeReader$$_$accessibleDenot$1(TreeUnpickler.scala:1066)
at dotty.tools.dotc.core.tasty.TreeUnpickler$TreeReader.completeSelect$1(TreeUnpickler.scala:1057)
at dotty.tools.dotc.core.tasty.TreeUnpickler$TreeReader.readSimpleTerm$1(TreeUnpickler.scala:1080)
at dotty.tools.dotc.core.tasty.TreeUnpickler$TreeReader.readTerm(TreeUnpickler.scala:1250)
at dotty.tools.dotc.core.tasty.TreeUnpickler$TreeReader.readLengthTerm$1(TreeUnpickler.scala:1112)
at dotty.tools.dotc.core.tasty.TreeUnpickler$TreeReader.readTerm(TreeUnpickler.scala:1250)
at dotty.tools.dotc.core.tasty.TreeUnpickler.readRhs$2$$anonfun$2$$anonfun$1(TreeUnpickler.scala:792)
at dotty.tools.dotc.core.tasty.TreeUnpickler$LazyReader.complete(TreeUnpickler.scala:1382)
at dotty.tools.dotc.ast.Trees$WithLazyField.forceIfLazy(Trees.scala:915)
at dotty.tools.dotc.ast.Trees$WithLazyField.forceIfLazy$(Trees.scala:910)
at dotty.tools.dotc.ast.Trees$ValOrDefDef.forceIfLazy(Trees.scala:377)
at dotty.tools.dotc.ast.Trees$ValOrDefDef.rhs(Trees.scala:382)
at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.foldOver(Trees.scala:1471)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.traverseChildren(Trees.scala:1511)
at dotty.tools.dotc.CompilationUnit$Force.traverse(CompilationUnit.scala:123)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1510)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1510)
at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.fold$1(Trees.scala:1385)
at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.apply(Trees.scala:1387)
at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.foldOver(Trees.scala:1482)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.traverseChildren(Trees.scala:1511)
at dotty.tools.dotc.CompilationUnit$Force.traverse(CompilationUnit.scala:123)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1510)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1510)
at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.foldOver(Trees.scala:1479)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.traverseChildren(Trees.scala:1511)
at dotty.tools.dotc.CompilationUnit$Force.traverse(CompilationUnit.scala:123)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1510)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1510)
at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.fold$1(Trees.scala:1385)
at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.apply(Trees.scala:1387)
at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.foldOver(Trees.scala:1482)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.traverseChildren(Trees.scala:1511)
at dotty.tools.dotc.CompilationUnit$Force.traverse(CompilationUnit.scala:123)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1510)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1510)
at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.foldOver(Trees.scala:1479)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.traverseChildren(Trees.scala:1511)
at dotty.tools.dotc.CompilationUnit$Force.traverse(CompilationUnit.scala:123)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1510)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.apply(Trees.scala:1510)
at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.fold$1(Trees.scala:1385)
at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.apply(Trees.scala:1387)
at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.foldOver(Trees.scala:1486)
at dotty.tools.dotc.ast.Trees$Instance$TreeAccumulator.foldOver(Trees.scala:1391)
at dotty.tools.dotc.ast.Trees$Instance$TreeTraverser.traverseChildren(Trees.scala:1511)
at dotty.tools.dotc.CompilationUnit$Force.traverse(CompilationUnit.scala:123)
at dotty.tools.dotc.CompilationUnit$.apply(CompilationUnit.scala:92)
at dotty.tools.dotc.CompilationUnit$.apply(CompilationUnit.scala:83)
at dotty.tools.dotc.fromtasty.ReadTasty.compilationUnit$1(ReadTasty.scala:42)
at dotty.tools.dotc.fromtasty.ReadTasty.readTASTY(ReadTasty.scala:71)
at dotty.tools.dotc.fromtasty.ReadTasty.runOn$$anonfun$1(ReadTasty.scala:25)
at scala.collection.immutable.List.flatMap(List.scala:293)
at dotty.tools.dotc.fromtasty.ReadTasty.runOn(ReadTasty.scala:25)
at dotty.tools.dotc.Run.runPhases$4$$anonfun$4(Run.scala:185)
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:195)
at dotty.tools.dotc.Run.compileUnits$$anonfun$1(Run.scala:203)
at dotty.runtime.function.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12)
at dotty.tools.dotc.util.Stats$.maybeMonitored(Stats.scala:63)
at dotty.tools.dotc.Run.compileUnits(Run.scala:210)
at dotty.tools.dotc.Run.compileUnits(Run.scala:152)
at dotty.tools.dotc.fromtasty.TASTYRun.compile(TASTYRun.scala:10)
at dotty.tools.dotc.Driver.doCompile(Driver.scala:38)
at dotty.tools.dotc.Driver.process(Driver.scala:195)
at dotty.tools.dotc.Driver.process(Driver.scala:164)
at dotty.tools.dotc.Driver.process(Driver.scala:176)
at dotty.tools.dotc.Driver.main(Driver.scala:203)
at dotty.tools.dotc.decompiler.Main.main(Main.scala)
Thanks @griggt, nice reproduction! Sorry I haven't had time to look at it again
Most helpful comment
Here's a reproducer without the
catsdependency.It seems that the issue is only triggered if the typeclass is defined in a separate artifact, so I just built a simple library:
then referred to it in the testcase:
and watched it go boom:
Output -- click to expand