summaryrefslogtreecommitdiff
path: root/src/compiler/scala/tools/nsc/transform/Erasure.scala
diff options
context:
space:
mode:
Diffstat (limited to 'src/compiler/scala/tools/nsc/transform/Erasure.scala')
-rw-r--r--src/compiler/scala/tools/nsc/transform/Erasure.scala13
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