diff options
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)) } |