Skip to content

Commit d0b9441

Browse files
committed
Fix #3596: Handle supercall arguments in unpickler
1 parent 15b4c2a commit d0b9441

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

@@ -423,7 +426,7 @@ class TreeUnpickler(reader: TastyReader, nameAtRef: NameRef => TermName, posUnpi
423426
case VALDEF | DEFDEF | TYPEDEF | TYPEPARAM | PARAM =>
424427
createMemberSymbol()
425428
case TEMPLATE =>
426-
val localDummy = ctx.newLocalDummy(ctx.owner)
429+
val localDummy = localDummies(ctx.owner.asClass)
427430
registerSym(currentAddr, localDummy)
428431
localDummy
429432
case tag =>
@@ -474,6 +477,7 @@ class TreeUnpickler(reader: TastyReader, nameAtRef: NameRef => TermName, posUnpi
474477
ctx.enter(sym)
475478
registerSym(start, sym)
476479
if (isClass) {
480+
localDummies(sym.asClass) = ctx.newLocalDummy(sym)
477481
sym.completer.withDecls(newScope)
478482
forkAt(templateStart).indexTemplateParams()(localContext(sym))
479483
}
@@ -741,14 +745,15 @@ class TreeUnpickler(reader: TastyReader, nameAtRef: NameRef => TermName, posUnpi
741745
else NoType
742746
cls.info = new TempClassInfo(cls.owner.thisType, cls, cls.unforcedDecls, assumedSelfType)
743747
val localDummy = symbolAtCurrent()
748+
val parentCtx = ctx.withOwner(localDummy)
744749
assert(readByte() == TEMPLATE)
745750
val end = readEnd()
746751
val tparams = readIndexedParams[TypeDef](TYPEPARAM)
747752
val vparams = readIndexedParams[ValDef](PARAM)
748753
val parents = collectWhile(nextByte != SELFDEF && nextByte != DEFDEF) {
749754
nextByte match {
750-
case APPLY | TYPEAPPLY => readTerm()
751-
case _ => readTpt()
755+
case APPLY | TYPEAPPLY => readTerm()(parentCtx)
756+
case _ => readTpt()(parentCtx)
752757
}
753758
}
754759
val parentTypes = parents.map(_.tpe.dealias)
@@ -762,13 +767,14 @@ class TreeUnpickler(reader: TastyReader, nameAtRef: NameRef => TermName, posUnpi
762767
if (self.isEmpty) NoType else self.tpt.tpe)
763768
cls.setNoInitsFlags(fork.indexStats(end))
764769
val constr = readIndexedDef().asInstanceOf[DefDef]
770+
val mappedParents = parents.map(_.changeOwner(localDummy, constr.symbol))
765771

766772
val lazyStats = readLater(end, rdr => implicit ctx => {
767773
val stats = rdr.readIndexedStats(localDummy, end)
768774
tparams ++ vparams ++ stats
769775
})
770776
setPos(start,
771-
untpd.Template(constr, parents, self, lazyStats)
777+
untpd.Template(constr, mappedParents, self, lazyStats)
772778
.withType(localDummy.termRef))
773779
}
774780

@@ -918,15 +924,10 @@ class TreeUnpickler(reader: TastyReader, nameAtRef: NameRef => TermName, posUnpi
918924
def readLengthTerm(): Tree = {
919925
val end = readEnd()
920926

921-
def localNonClassCtx = {
922-
val ctx1 = ctx.fresh.setNewScope
923-
if (ctx.owner.isClass) ctx1.setOwner(ctx1.newLocalDummy(ctx.owner)) else ctx1
924-
}
925-
926927
def readBlock(mkTree: (List[Tree], Tree) => Tree): Tree = {
927928
val exprReader = fork
928929
skipTree()
929-
val localCtx = localNonClassCtx
930+
val localCtx = ctx.fresh.setNewScope
930931
val stats = readStats(ctx.owner, end)(localCtx)
931932
val expr = exprReader.readTerm()(localCtx)
932933
mkTree(stats, expr)
@@ -1026,7 +1027,11 @@ class TreeUnpickler(reader: TastyReader, nameAtRef: NameRef => TermName, posUnpi
10261027
case ANNOTATEDtpt =>
10271028
Annotated(readTpt(), readTerm())
10281029
case LAMBDAtpt =>
1029-
val localCtx = localNonClassCtx
1030+
var localCtx = ctx.fresh.setNewScope
1031+
ctx.owner match {
1032+
case cls: ClassSymbol => localCtx = localCtx.setOwner(localDummies(cls))
1033+
case _ =>
1034+
}
10301035
val tparams = readParams[TypeDef](TYPEPARAM)(localCtx)
10311036
val body = readTpt()(localCtx)
10321037
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)