aboutsummaryrefslogtreecommitdiff
path: root/compiler/src/dotty/tools
diff options
context:
space:
mode:
authorliu fengyun <liu@fengy.me>2016-12-18 00:56:18 +0100
committerliu fengyun <liu@fengy.me>2016-12-18 00:57:02 +0100
commit152e4690edd3e5ad484519baccdf679cfa0919ed (patch)
tree33f71b3956d1a49da586915b63b64acf31d5d0d1 /compiler/src/dotty/tools
parent5df985cc599a0c69029773e3416bbb5fc883476a (diff)
downloaddotty-152e4690edd3e5ad484519baccdf679cfa0919ed.tar.gz
dotty-152e4690edd3e5ad484519baccdf679cfa0919ed.tar.bz2
dotty-152e4690edd3e5ad484519baccdf679cfa0919ed.zip
fix #1820: make sure outer of traits implemented
Diffstat (limited to 'compiler/src/dotty/tools')
-rw-r--r--compiler/src/dotty/tools/dotc/transform/ExplicitOuter.scala19
1 files changed, 12 insertions, 7 deletions
diff --git a/compiler/src/dotty/tools/dotc/transform/ExplicitOuter.scala b/compiler/src/dotty/tools/dotc/transform/ExplicitOuter.scala
index 5463d5080..e792518ce 100644
--- a/compiler/src/dotty/tools/dotc/transform/ExplicitOuter.scala
+++ b/compiler/src/dotty/tools/dotc/transform/ExplicitOuter.scala
@@ -81,14 +81,19 @@ class ExplicitOuter extends MiniPhaseTransform with InfoTransformer { thisTransf
!needsOuterAlways(cls) &&
impl.existsSubTree(referencesOuter(cls, _)))
ensureOuterAccessors(cls)
- if (hasOuter(cls)) {
+
+ val hasOuterFlag = hasOuter(cls)
+ if (hasOuterFlag || cls.mixins.exists(needsOuterIfReferenced)) {
val newDefs = new mutable.ListBuffer[Tree]
- if (isTrait)
- newDefs += DefDef(outerAccessor(cls).asTerm, EmptyTree)
- else {
- val outerParamAcc = outerParamAccessor(cls)
- newDefs += ValDef(outerParamAcc, EmptyTree)
- newDefs += DefDef(outerAccessor(cls).asTerm, ref(outerParamAcc))
+
+ if (hasOuterFlag) {
+ if (isTrait)
+ newDefs += DefDef(outerAccessor(cls).asTerm, EmptyTree)
+ else {
+ val outerParamAcc = outerParamAccessor(cls)
+ newDefs += ValDef(outerParamAcc, EmptyTree)
+ newDefs += DefDef(outerAccessor(cls).asTerm, ref(outerParamAcc))
+ }
}
for (parentTrait <- cls.mixins) {