diff options
author | Martin Odersky <odersky@gmail.com> | 2017-03-20 17:26:27 +0100 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2017-03-20 17:26:27 +0100 |
commit | 20d48d988732ac3c721f31d1a4b8487047b9e92c (patch) | |
tree | aa266ccef6b4857b4862ad66816cc959354283ae /compiler/src/dotty/tools/dotc/transform | |
parent | d1e4911596cb10d5665ff801d10f15b48250581f (diff) | |
download | dotty-20d48d988732ac3c721f31d1a4b8487047b9e92c.tar.gz dotty-20d48d988732ac3c721f31d1a4b8487047b9e92c.tar.bz2 dotty-20d48d988732ac3c721f31d1a4b8487047b9e92c.zip |
Only use shadowed when necessary
Diffstat (limited to 'compiler/src/dotty/tools/dotc/transform')
-rw-r--r-- | compiler/src/dotty/tools/dotc/transform/ParamForwarding.scala | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/compiler/src/dotty/tools/dotc/transform/ParamForwarding.scala b/compiler/src/dotty/tools/dotc/transform/ParamForwarding.scala index a6c4b5d8d..2836ebcfe 100644 --- a/compiler/src/dotty/tools/dotc/transform/ParamForwarding.scala +++ b/compiler/src/dotty/tools/dotc/transform/ParamForwarding.scala @@ -67,13 +67,14 @@ class ParamForwarding(thisTransformer: DenotTransformer) { def forwarder(implicit ctx: Context) = { sym.copySymDenotation(initFlags = sym.flags | Method | Stable, info = sym.info.ensureMethodic) .installAfter(thisTransformer) - val superAcc = - Super(This(currentClass), tpnme.EMPTY, inConstrCall = false) - .select(alias) - val stpe @ TermRef(_, _) = superAcc.tpe - val superAccShadowed = superAcc.withType(stpe.shadowed) - typr.println(i"adding param forwarder $superAccShadowed") - DefDef(sym, superAccShadowed.ensureConforms(sym.info.widen)) + var superAcc = + Super(This(currentClass), tpnme.EMPTY, inConstrCall = false).select(alias) + if (alias.owner != currentClass.superClass) + // need to use shadowed in order not to accidentally address an + // intervening private forwarder in the superclass + superAcc = superAcc.withType(superAcc.tpe.asInstanceOf[TermRef].shadowed) + typr.println(i"adding param forwarder $superAcc") + DefDef(sym, superAcc.ensureConforms(sym.info.widen)) } return forwarder(ctx.withPhase(thisTransformer.next)) } |