diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/dotty/tools/dotc/transform/Erasure.scala | 18 | ||||
-rw-r--r-- | src/dotty/tools/dotc/transform/LambdaLift.scala | 2 |
2 files changed, 15 insertions, 5 deletions
diff --git a/src/dotty/tools/dotc/transform/Erasure.scala b/src/dotty/tools/dotc/transform/Erasure.scala index 36d75b149..749bbed93 100644 --- a/src/dotty/tools/dotc/transform/Erasure.scala +++ b/src/dotty/tools/dotc/transform/Erasure.scala @@ -469,16 +469,26 @@ object Erasure extends TypeTestsCasts{ tpt = untpd.TypedSplice(TypeTree(sym.info).withPos(vdef.tpt.pos))), sym) override def typedDefDef(ddef: untpd.DefDef, sym: Symbol)(implicit ctx: Context) = { - val restpe = sym.info.resultType + var effectiveSym = sym + if (sym == defn.newRefArrayMethod) { + // newRefArray is treated specially: It's the only source-defined method + // that has a polymorphic type after erasure. But treating its (dummy) definition + // with a polymorphic type at and after erasure is an awkward special case. + // We therefore rewrite the method definition with a new Symbol of type + // (length: Int)Object + val MethodType(pnames, ptypes) = sym.info.resultType + effectiveSym = sym.copy(info = MethodType(pnames, ptypes, defn.ObjectType)) + } + val restpe = effectiveSym.info.resultType val ddef1 = untpd.cpy.DefDef(ddef)( tparams = Nil, - vparamss = (outer.paramDefs(sym) ::: ddef.vparamss.flatten) :: Nil, + vparamss = (outer.paramDefs(effectiveSym) ::: ddef.vparamss.flatten) :: Nil, tpt = untpd.TypedSplice(TypeTree(restpe).withPos(ddef.tpt.pos)), rhs = ddef.rhs match { case id @ Ident(nme.WILDCARD) => untpd.TypedSplice(id.withType(restpe)) case _ => ddef.rhs }) - super.typedDefDef(ddef1, sym) + super.typedDefDef(ddef1, effectiveSym) } /** After erasure, we may have to replace the closure method by a bridge. @@ -600,7 +610,7 @@ object Erasure extends TypeTestsCasts{ traverse(newStats, oldStats) } - + private final val NoBridgeFlags = Flags.Accessor | Flags.Deferred | Flags.Lazy /** Create a bridge DefDef which overrides a parent method. diff --git a/src/dotty/tools/dotc/transform/LambdaLift.scala b/src/dotty/tools/dotc/transform/LambdaLift.scala index 42c6e85af..0cbbb769f 100644 --- a/src/dotty/tools/dotc/transform/LambdaLift.scala +++ b/src/dotty/tools/dotc/transform/LambdaLift.scala @@ -292,7 +292,7 @@ class LambdaLift extends MiniPhase with IdentityDenotTransformer { thisTransform val encClass = local.enclosingClass val topClass = local.topLevelClass // member of a static object - if (encClass.isStatic && encClass.isProperlyContainedIn(topClass)) { + if (encClass.isStatic && encClass.isContainedIn(topClass)) { // though the second condition seems weird, it's not true for symbols which are defined in some // weird combinations of super calls. (encClass, EmptyFlags) |