Skip to content

Commit 8fe1a0e

Browse files
committed
Traverse all of bindings to compute reference counts of bindings
We used to traverse only the RHS of bindings, but this misses references that are part of the binding's type.
1 parent 8e5eaca commit 8fe1a0e

File tree

1 file changed

+5
-11
lines changed

1 file changed

+5
-11
lines changed

compiler/src/dotty/tools/dotc/typer/Inliner.scala

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -579,19 +579,13 @@ class Inliner(call: tpd.Tree, rhsToInline: tpd.Tree)(implicit ctx: Context) {
579579
}
580580
val countRefs = new TreeTraverser {
581581
override def traverse(t: Tree)(implicit ctx: Context) = {
582+
def updateRefCount(sym: Symbol, inc: Int) =
583+
for (x <- refCount.get(sym)) refCount(sym) = x + inc
582584
t match {
583-
case t: RefTree =>
584-
refCount.get(t.symbol) match {
585-
case Some(x) => refCount(t.symbol) = x + 1
586-
case none =>
587-
}
585+
case t: RefTree => updateRefCount(t.symbol, 1)
588586
case _: New | _: TypeTree =>
589587
t.tpe.foreachPart {
590-
case ref: TermRef =>
591-
refCount.get(ref.symbol) match {
592-
case Some(x) => refCount(ref.symbol) = x + 2
593-
case none =>
594-
}
588+
case ref: TermRef => updateRefCount(ref.symbol, 2) // can't be inlined, so make sure refCount is at least 2
595589
case _ =>
596590
}
597591
case _ =>
@@ -600,7 +594,7 @@ class Inliner(call: tpd.Tree, rhsToInline: tpd.Tree)(implicit ctx: Context) {
600594
}
601595
}
602596
countRefs.traverse(tree)
603-
for (binding <- bindings) countRefs.traverse(binding.rhs)
597+
for (binding <- bindings) countRefs.traverse(binding)
604598
val inlineBindings = new TreeMap {
605599
override def transform(t: Tree)(implicit ctx: Context) =
606600
super.transform {

0 commit comments

Comments
 (0)