Skip to content

Commit

Permalink
Avoid too eager transform of outer for lhs & accessor rhs
Browse files Browse the repository at this point in the history
[Cherry-picked 2ff4ba7]
  • Loading branch information
szymon-rd authored and WojciechMazur committed Jun 23, 2024
1 parent e0c235f commit 43dde38
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 43dde38

Please sign in to comment.