Skip to content

Commit 63a2f00

Browse files
committed
LambdaLift: reload non-sym denotations when needed
1 parent c413ea2 commit 63a2f00

File tree

2 files changed

+27
-0
lines changed

2 files changed

+27
-0
lines changed

compiler/src/dotty/tools/dotc/transform/LambdaLift.scala

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package dotty.tools.dotc
22
package transform
33

44
import MegaPhase._
5+
import core.Denotations.NonSymSingleDenotation
56
import core.DenotTransformers._
67
import core.Symbols._
78
import core.Contexts._
@@ -530,7 +531,14 @@ class LambdaLift extends MiniPhase with IdentityDenotTransformer { thisPhase =>
530531
override def prepareForUnit(tree: Tree)(using Context): Context =
531532
ctx.fresh.updateStore(Lifter, new Lifter(thisPhase))
532533

534+
private def reloadDenotation(tp: Type)(using Context): Unit = tp match
535+
case tp: NamedType =>
536+
if tp.denot.isInstanceOf[NonSymSingleDenotation] && lifter.free.contains(tp.symbol) then
537+
tp.recomputeDenot()
538+
case _ =>
539+
533540
override def transformIdent(tree: Ident)(using Context): Tree = {
541+
reloadDenotation(tree.tpe)
534542
val sym = tree.symbol
535543
tree.tpe match {
536544
case tpe @ TermRef(prefix, _) =>
@@ -549,6 +557,16 @@ class LambdaLift extends MiniPhase with IdentityDenotTransformer { thisPhase =>
549557
}
550558
}
551559

560+
override def transformSelect(tree: Select)(using Context): Tree =
561+
val denot = tree.denot
562+
val sym = tree.symbol
563+
// The Lifter updates the type of symbols using `installAfter` to give them a
564+
// new `SymDenotation`, but that doesn't affect non-sym denotations, so we
565+
// reload them manually here.
566+
if !denot.isInstanceOf[core.SymDenotations.SymDenotation] && lifter.free.contains(sym) then
567+
tree.qualifier.select(sym).withSpan(tree.span)
568+
else tree
569+
552570
override def transformApply(tree: Apply)(using Context): Apply =
553571
cpy.Apply(tree)(tree.fun, lifter.addFreeArgs(tree.symbol, tree.args)).withSpan(tree.span)
554572

tests/pos/t6231c.scala

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
object Bug {
2+
def bar(ev: Any) = {
3+
trait X(val x: Int) {
4+
def qux: () => x.type = { () => println(ev); x }
5+
}
6+
(new X(1) {}).qux()
7+
}
8+
}
9+

0 commit comments

Comments
 (0)