aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDmitry Petrashko <dmitry.petrashko@gmail.com>2015-04-01 13:34:17 +0200
committerGuillaume Martres <smarter@ubuntu.com>2015-04-01 17:54:38 +0200
commit8b704feb57a14b04557b81f5274d5f06c5b2a09c (patch)
tree3e01409468982215ed5352b335235aa159553bea /src
parent2362081bbc80a4edbec954b07698a0729c334947 (diff)
downloaddotty-8b704feb57a14b04557b81f5274d5f06c5b2a09c.tar.gz
dotty-8b704feb57a14b04557b81f5274d5f06c5b2a09c.tar.bz2
dotty-8b704feb57a14b04557b81f5274d5f06c5b2a09c.zip
Fix wrong owning context during adaptation inside forwarders.
Diffstat (limited to 'src')
-rw-r--r--src/dotty/tools/dotc/transform/Erasure.scala20
1 files changed, 14 insertions, 6 deletions
diff --git a/src/dotty/tools/dotc/transform/Erasure.scala b/src/dotty/tools/dotc/transform/Erasure.scala
index b9feaf588..914da293f 100644
--- a/src/dotty/tools/dotc/transform/Erasure.scala
+++ b/src/dotty/tools/dotc/transform/Erasure.scala
@@ -504,19 +504,27 @@ object Erasure extends TypeTestsCasts{
}
def makeBridgeDef(newDef: tpd.DefDef, parentSym: Symbol)(implicit ctx: Context): tpd.DefDef = {
+ val newDefSym = newDef.symbol
+ val currentClass = newDefSym.owner.asClass
+
def error(reason: String) = {
- assert(false, s"failure creating bridge from ${newDef.symbol} to ${parentSym}, reason: $reason")
+ assert(false, s"failure creating bridge from ${newDefSym} to ${parentSym}, reason: $reason")
???
}
- val bridge = ctx.newSymbol(newDef.symbol.owner,
- parentSym.name, parentSym.flags | Flags.Bridge, parentSym.info, coord = newDef.symbol.owner.coord).asTerm
+ val bridge = ctx.newSymbol(currentClass,
+ parentSym.name, parentSym.flags | Flags.Bridge, parentSym.info, coord = newDefSym.owner.coord).asTerm
bridge.enteredAfter(ctx.phase.prev.asInstanceOf[DenotTransformer]) // this should be safe, as we're executing in context of next phase
- ctx.debuglog(s"generating bridge from ${newDef.symbol} to $bridge")
+ ctx.debuglog(s"generating bridge from ${newDefSym} to $bridge")
+
+ val sel: Tree = This(currentClass).select(newDefSym.termRef)
- val sel: Tree = This(newDef.symbol.owner.asClass).select(newDef.symbol.termRef)
+ val resultType = parentSym.info.widen.resultType
+
+ val bridgeCtx = ctx.withOwner(bridge)
- val resultType = bridge.info.widen.resultType
tpd.DefDef(bridge, { paramss: List[List[tpd.Tree]] =>
+ implicit val ctx: Context = bridgeCtx
+
val rhs = paramss.foldLeft(sel)((fun, vparams) =>
fun.tpe.widen match {
case MethodType(names, types) => Apply(fun, (vparams, types).zipped.map(adapt(_, _, untpd.EmptyTree)))