Skip to content

Commit

Permalink
Backport "Avoid too eager transform of $outer for lhs & accessor rhs"…
Browse files Browse the repository at this point in the history
… to LTS (#20751)

Backports #18949 to the LTS branch.

PR submitted by the release tooling.
[skip ci]
  • Loading branch information
WojciechMazur authored Jun 23, 2024
2 parents 41e45c5 + 43dde38 commit 5ab89f4
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 0 deletions.
5 changes: 5 additions & 0 deletions compiler/src/dotty/tools/dotc/transform/Constructors.scala
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import Symbols._
import Decorators._
import DenotTransformers._
import collection.mutable
import Types.*

object Constructors {
val name: String = "constructors"
Expand Down Expand Up @@ -197,6 +198,10 @@ class Constructors extends MiniPhase with IdentityDenotTransformer { thisPhase =
) &&
fn.symbol.info.resultType.classSymbol == outerParam.info.classSymbol =>
ref(outerParam)
case Assign(lhs, rhs) if lhs.symbol.name == nme.OUTER => // not transform LHS of assignment to $outer field
cpy.Assign(tree)(lhs, super.transform(rhs))
case dd: DefDef if dd.name.endsWith(nme.OUTER.asSimpleName) => // not transform RHS of outer accessor
dd
case tree: RefTree if tree.symbol.is(ParamAccessor) && tree.symbol.name == nme.OUTER =>
ref(outerParam)
case _ =>
Expand Down
14 changes: 14 additions & 0 deletions tests/pos/i18927.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
class A

class B {
val a = new A

class C(i: Int) {
def this() = {
this(1)
class Inner() {
println(a)
}
}
}
}

0 comments on commit 5ab89f4

Please sign in to comment.