diff options
author | Martin Odersky <odersky@gmail.com> | 2015-06-20 00:56:45 +0200 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2015-06-20 00:56:45 +0200 |
commit | 91e69cbf65821bfe0346d0d0960f4b211c2dc849 (patch) | |
tree | 9741a3e39018cde7dd1aeadf2dfc6bd65c6ee262 /src/dotty/tools/dotc/transform/Constructors.scala | |
parent | 9a4b5e7c306eb3f1c82ace10dd62576473b1dec1 (diff) | |
download | dotty-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.scala | 6 |
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) |