aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--compiler/src/dotty/tools/dotc/transform/ExplicitOuter.scala3
-rw-r--r--tests/run/i1820.scala4
-rw-r--r--tests/run/i1820b.check1
-rw-r--r--tests/run/i1820b.scala19
4 files changed, 24 insertions, 3 deletions
diff --git a/compiler/src/dotty/tools/dotc/transform/ExplicitOuter.scala b/compiler/src/dotty/tools/dotc/transform/ExplicitOuter.scala
index e792518ce..007210926 100644
--- a/compiler/src/dotty/tools/dotc/transform/ExplicitOuter.scala
+++ b/compiler/src/dotty/tools/dotc/transform/ExplicitOuter.scala
@@ -79,7 +79,8 @@ class ExplicitOuter extends MiniPhaseTransform with InfoTransformer { thisTransf
val isTrait = cls.is(Trait)
if (needsOuterIfReferenced(cls) &&
!needsOuterAlways(cls) &&
- impl.existsSubTree(referencesOuter(cls, _)))
+ (cls.mixins.exists(needsOuterIfReferenced) ||
+ impl.existsSubTree(referencesOuter(cls, _))))
ensureOuterAccessors(cls)
val hasOuterFlag = hasOuter(cls)
diff --git a/tests/run/i1820.scala b/tests/run/i1820.scala
index bc4f63d9b..b39e6d108 100644
--- a/tests/run/i1820.scala
+++ b/tests/run/i1820.scala
@@ -6,9 +6,9 @@ class A {
}
}
-class Inner extends O.a.Inner
+class Inner extends Test.a.Inner
-object O {
+object Test {
val a = new A
def main(args: Array[String]): Unit = {
diff --git a/tests/run/i1820b.check b/tests/run/i1820b.check
new file mode 100644
index 000000000..789819226
--- /dev/null
+++ b/tests/run/i1820b.check
@@ -0,0 +1 @@
+a
diff --git a/tests/run/i1820b.scala b/tests/run/i1820b.scala
new file mode 100644
index 000000000..3452b6158
--- /dev/null
+++ b/tests/run/i1820b.scala
@@ -0,0 +1,19 @@
+trait A {
+ val a = "a"
+ trait Inner {
+ def f = println(a)
+ def h = 3
+ }
+}
+
+trait B extends A {
+ trait Inner2 extends Inner
+ def g = new Inner2 {}
+}
+
+object Test {
+ def main(args: Array[String]): Unit = {
+ val b = new B {}
+ b.g.f
+ }
+}