summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIulian Dragos <jaguarul@gmail.com>2007-08-31 15:30:33 +0000
committerIulian Dragos <jaguarul@gmail.com>2007-08-31 15:30:33 +0000
commit26109cdb6b024a09783e9ff1e0bb7ac64597a689 (patch)
tree2d63c60be0fa2b969405f838f0be681a1412592e
parent7c7ea4b57e070e0146c835ed61b52d69cda85c62 (diff)
downloadscala-26109cdb6b024a09783e9ff1e0bb7ac64597a689.tar.gz
scala-26109cdb6b024a09783e9ff1e0bb7ac64597a689.tar.bz2
scala-26109cdb6b024a09783e9ff1e0bb7ac64597a689.zip
Fixed crash in lazy traits (ticket #39).
-rw-r--r--src/compiler/scala/tools/nsc/transform/Mixin.scala4
-rw-r--r--test/files/run/lazy-traits.scala12
2 files changed, 14 insertions, 2 deletions
diff --git a/src/compiler/scala/tools/nsc/transform/Mixin.scala b/src/compiler/scala/tools/nsc/transform/Mixin.scala
index e4cd3c4f43..5ba3db1afa 100644
--- a/src/compiler/scala/tools/nsc/transform/Mixin.scala
+++ b/src/compiler/scala/tools/nsc/transform/Mixin.scala
@@ -564,7 +564,7 @@ abstract class Mixin extends InfoTransform {
If(mkTest(mask),
gen.mkSynchronized(gen.mkAttributedThis(clazz),
If(mkTest(mask),
- Block(List(gen.mkSynchronized(gen.mkAttributedThis(clazz), init),
+ Block(List(init,
mkSetFlag(bitmapSym, mask)),
Literal(Constant(()))),
EmptyTree)),
@@ -612,7 +612,7 @@ abstract class Mixin extends InfoTransform {
// if it is a mixed-in lazy value, complete the accessor
if (sym.hasFlag(LAZY) && sym.isGetter) {
val assign =
- Assign(gen.mkAttributedRef(sym.accessed),
+ Assign(Select(This(sym.accessed.owner), sym.accessed) /*gen.mkAttributedRef(sym.accessed)*/,
Apply(staticRef(initializer(sym)), gen.mkAttributedThis(clazz) :: Nil))
val rhs1 = mkLazyDef(clazz, assign, sym.accessed, offset)
diff --git a/test/files/run/lazy-traits.scala b/test/files/run/lazy-traits.scala
index 6238813e8d..bcfb2c45b8 100644
--- a/test/files/run/lazy-traits.scala
+++ b/test/files/run/lazy-traits.scala
@@ -124,6 +124,18 @@ trait LocalLazyVal {
}
}
+/** Test successful compilation (see ticket #39) */
+package x.y {
+
+ trait Trait {
+ lazy val v = 1
+ }
+
+ class OuterClass {
+ object InnerObject extends Trait
+ }
+}
+
object Test extends Application {
def test(name: String, v: A) {