diff options
author | Hubert Plociniczak <hubert.plociniczak@epfl.ch> | 2011-01-07 14:42:49 +0000 |
---|---|---|
committer | Hubert Plociniczak <hubert.plociniczak@epfl.ch> | 2011-01-07 14:42:49 +0000 |
commit | 8e9f3c219d05c50cb72446297b236704662879cb (patch) | |
tree | ee5f0377ffd2d391d85b2f672361422c3b27bcb3 /src | |
parent | 5cefd81ee9f99535e3e2ce8a23016206da65a92d (diff) | |
download | scala-8e9f3c219d05c50cb72446297b236704662879cb.tar.gz scala-8e9f3c219d05c50cb72446297b236704662879cb.tar.bz2 scala-8e9f3c219d05c50cb72446297b236704662879cb.zip |
Closes #4047. Review by odersky
Diffstat (limited to 'src')
-rw-r--r-- | src/compiler/scala/tools/nsc/transform/Erasure.scala | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/src/compiler/scala/tools/nsc/transform/Erasure.scala b/src/compiler/scala/tools/nsc/transform/Erasure.scala index 1df0b5bf3b..1a97c1f6c9 100644 --- a/src/compiler/scala/tools/nsc/transform/Erasure.scala +++ b/src/compiler/scala/tools/nsc/transform/Erasure.scala @@ -449,7 +449,10 @@ abstract class Erasure extends AddInterfaces with typechecker.Analyzer with ast. case _ => typedPos(tree.pos)(tree.tpe.typeSymbol match { case UnitClass => - if (treeInfo isPureExpr tree) REF(BoxedUnit_UNIT) + // Although lazy vals are pure expressions, + // we should still call them in bridge methods + if (treeInfo.isPureExpr(tree) && (tree.symbol == null || !tree.symbol.isLazy)) + REF(BoxedUnit_UNIT) else BLOCK(tree, REF(BoxedUnit_UNIT)) case x => assert(x != ArrayClass) @@ -818,15 +821,15 @@ abstract class Erasure extends AddInterfaces with typechecker.Analyzer with ast. while (opc.hasNext) { val member = opc.overriding val other = opc.overridden - //Console.println("bridge? " + member + ":" + member.tpe + member.locationString + " to " + other + ":" + other.tpe + other.locationString);//DEBUG + //Console.println("bridge? " + member + ":" + member.tpe + member.locationString + " to " + other + ":" + other.tpe + other.locationString)//DEBUG if (atPhase(currentRun.explicitouterPhase)(!member.isDeferred)) { - val otpe = erasure(other.tpe); + val otpe = erasure(other.tpe) val bridgeNeeded = atPhase(phase.next) ( !(other.tpe =:= member.tpe) && !(deconstMap(other.tpe) =:= deconstMap(member.tpe)) && { var e = bridgesScope.lookupEntry(member.name) while ((e ne null) && !((e.sym.tpe =:= otpe) && (bridgeTarget(e.sym) == member))) - e = bridgesScope.lookupNextEntry(e); + e = bridgesScope.lookupNextEntry(e) (e eq null) } ); @@ -860,7 +863,7 @@ abstract class Erasure extends AddInterfaces with typechecker.Analyzer with ast. log("generating bridge from " + other + "(" + Flags.flagsToString(bridge.flags) + ")" + ":" + otpe + other.locationString + " to " + member + ":" + erasure(member.tpe) + member.locationString + " =\n " + bridgeDef); bridgeDef } - } :: bridges; + } :: bridges } } opc.next |