Skip to content

Pickling typos involving tuples and recursive implicits computing their types #7058

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
anatoliykmetyuk opened this issue Aug 16, 2019 · 2 comments

Comments

@anatoliykmetyuk
Copy link
Contributor

anatoliykmetyuk commented Aug 16, 2019

To reproduce, compile with dotc -Ytest-pickler -color:never.

trait Duplicate[T <: Tuple] {
  type Res <: Tuple
  def apply(t: T): Res
}

object Duplicate {
  import Tuple.{ Head, Tail }
  type Aux[T <: Tuple, R] = Duplicate[T] { type Res = R }

  given [T <: NonEmptyTuple, TD <: Tuple] as Aux[T, (Head[T], Head[T]) *: TD]
  given (td: Aux[Tail[T], TD]) = new Duplicate[T] {
    type Res = (Head[T], Head[T]) *: TD
    def apply(t: T): Res = (t.head, t.head) *: td(t.tail)
  }

  given as Aux[Unit, Unit] = new Duplicate[Unit] {
    type Res = Unit
    def apply(t: Unit): Unit = ()
  }
}

def (x: T) duplicate[T <: Tuple, R] given (d: Duplicate.Aux[T, R]): R = d(x)

val x: (1, 2, 3) = (1, 2, 3)
val z: ((1, 1), (2, 2), (3, 3)) = x.duplicate
Crash
exception occurred while compiling ../pg/Main.scala
stale symbol; module class Main$package$#2546 in module class <empty>, defined in Period(1..9, run = 2), is referred to in run Period(1..1, run = 3)
class dotty.tools.dotc.reporting.diagnostic.messages$Error at ?: pickling difference for module class Main$package$ in ../pg/Main.scala, for details:

  diff before-pickling.txt after-pickling.txt while compiling ../pg/Main.scala
Exception in thread "main" class dotty.tools.dotc.reporting.diagnostic.messages$Error at ?: pickling difference for module class Main$package$ in ../pg/Main.scala, for details:

  diff before-pickling.txt after-pickling.txt
	at dotty.tools.dotc.reporting.Reporting.error(Reporter.scala:137)
	at dotty.tools.dotc.core.Contexts$Context.error(Contexts.scala:71)
	at dotty.tools.dotc.transform.Pickler.testSame(Pickler.scala:119)
	at dotty.tools.dotc.transform.Pickler.testUnpickler$$anonfun$4(Pickler.scala:111)
	at dotty.runtime.function.JProcedure1.apply(JProcedure1.java:15)
	at dotty.runtime.function.JProcedure1.apply(JProcedure1.java:10)
	at scala.collection.TraversableLike$WithFilter.$anonfun$foreach$1(TraversableLike.scala:792)
	at scala.collection.mutable.HashMap.$anonfun$foreach$1(HashMap.scala:149)
	at scala.collection.mutable.HashTable.foreachEntry(HashTable.scala:237)
	at scala.collection.mutable.HashTable.foreachEntry$(HashTable.scala:230)
	at scala.collection.mutable.HashMap.foreachEntry(HashMap.scala:44)
	at scala.collection.mutable.HashMap.foreach(HashMap.scala:149)
	at scala.collection.TraversableLike$WithFilter.foreach(TraversableLike.scala:791)
	at dotty.tools.dotc.transform.Pickler.testUnpickler(Pickler.scala:112)
	at dotty.tools.dotc.transform.Pickler.runOn(Pickler.scala:95)
	at dotty.tools.dotc.Run.runPhases$4$$anonfun$4(Run.scala:158)
	at dotty.runtime.function.JProcedure1.apply(JProcedure1.java:15)
	at dotty.runtime.function.JProcedure1.apply(JProcedure1.java:10)
	at scala.collection.IndexedSeqOptimized.foreach(IndexedSeqOptimized.scala:36)
	at scala.collection.IndexedSeqOptimized.foreach$(IndexedSeqOptimized.scala:33)
	at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:198)
	at dotty.tools.dotc.Run.runPhases$5(Run.scala:170)
	at dotty.tools.dotc.Run.compileUnits$$anonfun$1(Run.scala:178)
	at dotty.runtime.function.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12)
	at dotty.tools.dotc.util.Stats$.maybeMonitored(Stats.scala:65)
	at dotty.tools.dotc.Run.compileUnits(Run.scala:185)
	at dotty.tools.dotc.Run.compileSources(Run.scala:120)
	at dotty.tools.dotc.Run.compile(Run.scala:104)
	at dotty.tools.dotc.Driver.doCompile(Driver.scala:35)
	at dotty.tools.dotc.Driver.process(Driver.scala:180)
	at dotty.tools.dotc.Driver.process(Driver.scala:149)
	at dotty.tools.dotc.Driver.process(Driver.scala:161)
	at dotty.tools.dotc.Driver.main(Driver.scala:188)
	at dotty.tools.dotc.Main.main(Main.scala)

Diff in question

So basically, a *: b *: Unit gets messed up to (a, b).

@anatoliykmetyuk
Copy link
Contributor Author

Workaround: add misbehaving tests to /dotty/compiler/test/dotc/run-test-pickling.blacklist

@odersky
Copy link
Contributor

odersky commented Aug 25, 2019

So basically, a *: b *: Unit gets messed up to (a, b).

They mean the same thing. The printer desugars one to the other. The only question is why it did not do that before pickling. It could be that the type is aliased or that there is a type variable. But I think it is at present not very interesting to chase this down.

@odersky odersky closed this as completed Aug 25, 2019
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

2 participants