diff --git a/compiler/src/dotty/tools/dotc/transform/LambdaLift.scala b/compiler/src/dotty/tools/dotc/transform/LambdaLift.scala index 2409d0f94815..a7f7808da5d1 100644 --- a/compiler/src/dotty/tools/dotc/transform/LambdaLift.scala +++ b/compiler/src/dotty/tools/dotc/transform/LambdaLift.scala @@ -2,6 +2,7 @@ package dotty.tools.dotc package transform import MegaPhase._ +import core.Denotations.NonSymSingleDenotation import core.DenotTransformers._ import core.Symbols._ import core.Contexts._ @@ -549,6 +550,16 @@ class LambdaLift extends MiniPhase with IdentityDenotTransformer { thisPhase => } } + override def transformSelect(tree: Select)(using Context): Tree = + val denot = tree.denot + val sym = tree.symbol + // The Lifter updates the type of symbols using `installAfter` to give them a + // new `SymDenotation`, but that doesn't affect non-sym denotations, so we + // reload them manually here. + if denot.isInstanceOf[NonSymSingleDenotation] && lifter.free.contains(sym) then + tree.qualifier.select(sym).withSpan(tree.span) + else tree + override def transformApply(tree: Apply)(using Context): Apply = cpy.Apply(tree)(tree.fun, lifter.addFreeArgs(tree.symbol, tree.args)).withSpan(tree.span) diff --git a/tests/pos/t6231c.scala b/tests/pos/t6231c.scala new file mode 100644 index 000000000000..891d389f3720 --- /dev/null +++ b/tests/pos/t6231c.scala @@ -0,0 +1,9 @@ +object Bug { + def bar(ev: Any) = { + trait X(val x: Int) { + def qux: () => x.type = { () => println(ev); x } + } + (new X(1) {}).qux() + } +} +