From 47e604db241cc776f11f5b3f7de3afc77a9cda5b Mon Sep 17 00:00:00 2001 From: Guillaume Martres Date: Fri, 19 Jan 2018 19:09:49 +0100 Subject: [PATCH] Fix #3873: Properly unpickle shared TypeTrees When a TypeTree is represented by a SHAREDterm, we need to follow the SHAREDterm and call `readTpt()` again. We cannot rely on `readTerm()` following the SHAREDterm for us because a TypeTree can be pickled as just a type. --- .../src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala | 8 ++++++-- tests/pos/i3873.scala | 6 ++++++ 2 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 tests/pos/i3873.scala diff --git a/compiler/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala b/compiler/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala index 3cb1c9034505..38ffe3963f05 100644 --- a/compiler/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala +++ b/compiler/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala @@ -1054,8 +1054,12 @@ class TreeUnpickler(reader: TastyReader, setPos(start, tree) } - def readTpt()(implicit ctx: Context) = - if (nextByte == SHAREDterm || isTypeTreeTag(nextUnsharedTag)) readTerm() + def readTpt()(implicit ctx: Context): Tree = + if (nextByte == SHAREDterm) { + readByte() + forkAt(readAddr()).readTpt() + } + else if (isTypeTreeTag(nextByte)) readTerm() else { val start = currentAddr val tp = readType() diff --git a/tests/pos/i3873.scala b/tests/pos/i3873.scala new file mode 100644 index 000000000000..ebb8b1cd70c9 --- /dev/null +++ b/tests/pos/i3873.scala @@ -0,0 +1,6 @@ +object Test { + inline def sum2(ys: List[Int]): Unit = { + ys.foldLeft(1) + } + val h1: ((List[Int]) => Unit) = sum2 +}