aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/transform/Constructors.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2015-06-20 00:56:45 +0200
committerMartin Odersky <odersky@gmail.com>2015-06-20 00:56:45 +0200
commit91e69cbf65821bfe0346d0d0960f4b211c2dc849 (patch)
tree9741a3e39018cde7dd1aeadf2dfc6bd65c6ee262 /src/dotty/tools/dotc/transform/Constructors.scala
parent9a4b5e7c306eb3f1c82ace10dd62576473b1dec1 (diff)
downloaddotty-91e69cbf65821bfe0346d0d0960f4b211c2dc849.tar.gz
dotty-91e69cbf65821bfe0346d0d0960f4b211c2dc849.tar.bz2
dotty-91e69cbf65821bfe0346d0d0960f4b211c2dc849.zip
Fix mapOuter to be type-preserving
Only outer references that point to the same class as the outer parameter should be mapped. Other outer references should be left alone. Such references can appear after the initial supercall of a constructor.
Diffstat (limited to 'src/dotty/tools/dotc/transform/Constructors.scala')
-rw-r--r--src/dotty/tools/dotc/transform/Constructors.scala6
1 files changed, 5 insertions, 1 deletions
diff --git a/src/dotty/tools/dotc/transform/Constructors.scala b/src/dotty/tools/dotc/transform/Constructors.scala
index 3d7af6bf5..1d94b3552 100644
--- a/src/dotty/tools/dotc/transform/Constructors.scala
+++ b/src/dotty/tools/dotc/transform/Constructors.scala
@@ -159,7 +159,11 @@ class Constructors extends MiniPhaseTransform with SymTransformer { thisTransfor
/** Map outer getters $outer and outer accessors $A$B$$$outer to the given outer parameter. */
def mapOuter(outerParam: Symbol) = new TreeMap {
override def transform(tree: Tree)(implicit ctx: Context) = tree match {
- case Apply(fn, Nil) if fn.symbol.is(OuterAccessor) || fn.symbol.isGetter && fn.symbol.name == nme.OUTER =>
+ case Apply(fn, Nil)
+ if (fn.symbol.is(OuterAccessor)
+ || fn.symbol.isGetter && fn.symbol.name == nme.OUTER
+ ) &&
+ fn.symbol.info.resultType.classSymbol == outerParam.info.classSymbol =>
ref(outerParam)
case _ =>
super.transform(tree)