diff options
-rw-r--r-- | src/compiler/scala/tools/nsc/transform/Erasure.scala | 13 | ||||
-rw-r--r-- | test/files/run/t4047.check | 5 | ||||
-rw-r--r-- | test/files/run/t4047.scala | 34 |
3 files changed, 5 insertions, 47 deletions
diff --git a/src/compiler/scala/tools/nsc/transform/Erasure.scala b/src/compiler/scala/tools/nsc/transform/Erasure.scala index 1a97c1f6c9..1df0b5bf3b 100644 --- a/src/compiler/scala/tools/nsc/transform/Erasure.scala +++ b/src/compiler/scala/tools/nsc/transform/Erasure.scala @@ -449,10 +449,7 @@ abstract class Erasure extends AddInterfaces with typechecker.Analyzer with ast. case _ => typedPos(tree.pos)(tree.tpe.typeSymbol match { case UnitClass => - // 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) + if (treeInfo isPureExpr tree) REF(BoxedUnit_UNIT) else BLOCK(tree, REF(BoxedUnit_UNIT)) case x => assert(x != ArrayClass) @@ -821,15 +818,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) } ); @@ -863,7 +860,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 diff --git a/test/files/run/t4047.check b/test/files/run/t4047.check deleted file mode 100644 index 2a942a70e0..0000000000 --- a/test/files/run/t4047.check +++ /dev/null @@ -1,5 +0,0 @@ -Unit: called A.foo -Unit: called B.foo -Unit: called C.foo -Unit: called D.foo -Unit: called D.foo diff --git a/test/files/run/t4047.scala b/test/files/run/t4047.scala deleted file mode 100644 index cd42a8b4df..0000000000 --- a/test/files/run/t4047.scala +++ /dev/null @@ -1,34 +0,0 @@ -trait Foo[T] { val foo: T} - -class A extends Foo[Unit]{ - lazy val foo = println("Unit: called A.foo") -} - -class B extends Foo[Unit]{ - val foo = println("Unit: called B.foo") -} - -trait Bar[T] { def foo: T} - -class C extends Bar[Unit]{ - lazy val foo = println("Unit: called C.foo") -} - -class D extends Bar[Unit]{ - def foo = println("Unit: called D.foo") -} - -object Test extends Application { - val a: Foo[Unit] = new A - a.foo - a.foo - val b: Foo[Unit] = new B - b.foo - b.foo - val c: Bar[Unit] = new C - c.foo - c.foo - val d: Bar[Unit] = new D - d.foo - d.foo -} |