Skip to content

Commit 5ab89f4

Browse files
Backport "Avoid too eager transform of $outer for lhs & accessor rhs" to LTS (#20751)
Backports #18949 to the LTS branch. PR submitted by the release tooling. [skip ci]
2 parents 41e45c5 + 43dde38 commit 5ab89f4

File tree

2 files changed

+19
-0
lines changed

2 files changed

+19
-0
lines changed

Diff for: compiler/src/dotty/tools/dotc/transform/Constructors.scala

+5
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import Symbols._
1515
import Decorators._
1616
import DenotTransformers._
1717
import collection.mutable
18+
import Types.*
1819

1920
object Constructors {
2021
val name: String = "constructors"
@@ -197,6 +198,10 @@ class Constructors extends MiniPhase with IdentityDenotTransformer { thisPhase =
197198
) &&
198199
fn.symbol.info.resultType.classSymbol == outerParam.info.classSymbol =>
199200
ref(outerParam)
201+
case Assign(lhs, rhs) if lhs.symbol.name == nme.OUTER => // not transform LHS of assignment to $outer field
202+
cpy.Assign(tree)(lhs, super.transform(rhs))
203+
case dd: DefDef if dd.name.endsWith(nme.OUTER.asSimpleName) => // not transform RHS of outer accessor
204+
dd
200205
case tree: RefTree if tree.symbol.is(ParamAccessor) && tree.symbol.name == nme.OUTER =>
201206
ref(outerParam)
202207
case _ =>

Diff for: tests/pos/i18927.scala

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
class A
2+
3+
class B {
4+
val a = new A
5+
6+
class C(i: Int) {
7+
def this() = {
8+
this(1)
9+
class Inner() {
10+
println(a)
11+
}
12+
}
13+
}
14+
}

0 commit comments

Comments
 (0)