Skip to content

Commit 152e469

Browse files
committed
fix #1820: make sure outer of traits implemented
1 parent 5df985c commit 152e469

File tree

3 files changed

+30
-7
lines changed

3 files changed

+30
-7
lines changed

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

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -81,14 +81,19 @@ class ExplicitOuter extends MiniPhaseTransform with InfoTransformer { thisTransf
8181
!needsOuterAlways(cls) &&
8282
impl.existsSubTree(referencesOuter(cls, _)))
8383
ensureOuterAccessors(cls)
84-
if (hasOuter(cls)) {
84+
85+
val hasOuterFlag = hasOuter(cls)
86+
if (hasOuterFlag || cls.mixins.exists(needsOuterIfReferenced)) {
8587
val newDefs = new mutable.ListBuffer[Tree]
86-
if (isTrait)
87-
newDefs += DefDef(outerAccessor(cls).asTerm, EmptyTree)
88-
else {
89-
val outerParamAcc = outerParamAccessor(cls)
90-
newDefs += ValDef(outerParamAcc, EmptyTree)
91-
newDefs += DefDef(outerAccessor(cls).asTerm, ref(outerParamAcc))
88+
89+
if (hasOuterFlag) {
90+
if (isTrait)
91+
newDefs += DefDef(outerAccessor(cls).asTerm, EmptyTree)
92+
else {
93+
val outerParamAcc = outerParamAccessor(cls)
94+
newDefs += ValDef(outerParamAcc, EmptyTree)
95+
newDefs += DefDef(outerAccessor(cls).asTerm, ref(outerParamAcc))
96+
}
9297
}
9398

9499
for (parentTrait <- cls.mixins) {

tests/run/i1820.check

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
a

tests/run/i1820.scala

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
class A {
2+
val a = "a"
3+
trait Inner {
4+
def f = println(a)
5+
def h = 3
6+
}
7+
}
8+
9+
class Inner extends O.a.Inner
10+
11+
object O {
12+
val a = new A
13+
14+
def main(args: Array[String]): Unit = {
15+
(new Inner).f
16+
}
17+
}

0 commit comments

Comments
 (0)