Skip to content

Commit f93368d

Browse files
committed
Fix #3596: Handle supercall arguments in unpickler
1 parent 63d02a6 commit f93368d

File tree

2 files changed

+18
-11
lines changed

2 files changed

+18
-11
lines changed

compiler/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,9 @@ class TreeUnpickler(reader: TastyReader, nameAtRef: NameRef => TermName, posUnpi
5555
*/
5656
private[this] var seenRoots: Set[Symbol] = Set()
5757

58+
/** A map from unpickled class symbols to their local dummies */
59+
private[this] val localDummies = new mutable.HashMap[ClassSymbol, Symbol]
60+
5861
/** The root owner tree. See `OwnerTree` class definition. Set by `enterTopLevel`. */
5962
private[this] var ownerTree: OwnerTree = _
6063

@@ -424,7 +427,7 @@ class TreeUnpickler(reader: TastyReader, nameAtRef: NameRef => TermName, posUnpi
424427
case VALDEF | DEFDEF | TYPEDEF | TYPEPARAM | PARAM =>
425428
createMemberSymbol()
426429
case TEMPLATE =>
427-
val localDummy = ctx.newLocalDummy(ctx.owner)
430+
val localDummy = localDummies(ctx.owner.asClass)
428431
registerSym(currentAddr, localDummy)
429432
localDummy
430433
case tag =>
@@ -478,6 +481,7 @@ class TreeUnpickler(reader: TastyReader, nameAtRef: NameRef => TermName, posUnpi
478481
ctx.enter(sym)
479482
registerSym(start, sym)
480483
if (isClass) {
484+
localDummies(sym.asClass) = ctx.newLocalDummy(sym)
481485
sym.completer.withDecls(newScope)
482486
forkAt(templateStart).indexTemplateParams()(localContext(sym))
483487
}
@@ -745,14 +749,15 @@ class TreeUnpickler(reader: TastyReader, nameAtRef: NameRef => TermName, posUnpi
745749
else NoType
746750
cls.info = new TempClassInfo(cls.owner.thisType, cls, cls.unforcedDecls, assumedSelfType)
747751
val localDummy = symbolAtCurrent()
752+
val parentCtx = ctx.withOwner(localDummy)
748753
assert(readByte() == TEMPLATE)
749754
val end = readEnd()
750755
val tparams = readIndexedParams[TypeDef](TYPEPARAM)
751756
val vparams = readIndexedParams[ValDef](PARAM)
752757
val parents = collectWhile(nextByte != SELFDEF && nextByte != DEFDEF) {
753758
nextByte match {
754-
case APPLY | TYPEAPPLY => readTerm()
755-
case _ => readTpt()
759+
case APPLY | TYPEAPPLY => readTerm()(parentCtx)
760+
case _ => readTpt()(parentCtx)
756761
}
757762
}
758763
val parentTypes = parents.map(_.tpe.dealias)
@@ -766,13 +771,14 @@ class TreeUnpickler(reader: TastyReader, nameAtRef: NameRef => TermName, posUnpi
766771
if (self.isEmpty) NoType else self.tpt.tpe)
767772
cls.setNoInitsFlags(fork.indexStats(end))
768773
val constr = readIndexedDef().asInstanceOf[DefDef]
774+
val mappedParents = parents.map(_.changeOwner(localDummy, constr.symbol))
769775

770776
val lazyStats = readLater(end, rdr => implicit ctx => {
771777
val stats = rdr.readIndexedStats(localDummy, end)
772778
tparams ++ vparams ++ stats
773779
})
774780
setPos(start,
775-
untpd.Template(constr, parents, self, lazyStats)
781+
untpd.Template(constr, mappedParents, self, lazyStats)
776782
.withType(localDummy.termRef))
777783
}
778784

@@ -922,15 +928,10 @@ class TreeUnpickler(reader: TastyReader, nameAtRef: NameRef => TermName, posUnpi
922928
def readLengthTerm(): Tree = {
923929
val end = readEnd()
924930

925-
def localNonClassCtx = {
926-
val ctx1 = ctx.fresh.setNewScope
927-
if (ctx.owner.isClass) ctx1.setOwner(ctx1.newLocalDummy(ctx.owner)) else ctx1
928-
}
929-
930931
def readBlock(mkTree: (List[Tree], Tree) => Tree): Tree = {
931932
val exprReader = fork
932933
skipTree()
933-
val localCtx = localNonClassCtx
934+
val localCtx = ctx.fresh.setNewScope
934935
val stats = readStats(ctx.owner, end)(localCtx)
935936
val expr = exprReader.readTerm()(localCtx)
936937
mkTree(stats, expr)
@@ -1030,7 +1031,11 @@ class TreeUnpickler(reader: TastyReader, nameAtRef: NameRef => TermName, posUnpi
10301031
case ANNOTATEDtpt =>
10311032
Annotated(readTpt(), readTerm())
10321033
case LAMBDAtpt =>
1033-
val localCtx = localNonClassCtx
1034+
var localCtx = ctx.fresh.setNewScope
1035+
ctx.owner match {
1036+
case cls: ClassSymbol => localCtx = localCtx.setOwner(localDummies(cls))
1037+
case _ =>
1038+
}
10341039
val tparams = readParams[TypeDef](TYPEPARAM)(localCtx)
10351040
val body = readTpt()(localCtx)
10361041
LambdaTypeTree(tparams, body)

tests/pos-from-tasty/i3596.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
class Bar(ctor : Int => Int)
2+
class Foo extends Bar(x => x)

0 commit comments

Comments
 (0)