summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/compiler/scala/tools/nsc/ast/parser/TreeBuilder.scala2
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/RefChecks.scala9
-rw-r--r--test/files/run/lazy-exprs.check3
-rw-r--r--test/files/run/lazy-exprs.scala11
4 files changed, 20 insertions, 5 deletions
diff --git a/src/compiler/scala/tools/nsc/ast/parser/TreeBuilder.scala b/src/compiler/scala/tools/nsc/ast/parser/TreeBuilder.scala
index f8efc95c74..fcee9c4d0e 100644
--- a/src/compiler/scala/tools/nsc/ast/parser/TreeBuilder.scala
+++ b/src/compiler/scala/tools/nsc/ast/parser/TreeBuilder.scala
@@ -420,7 +420,7 @@ abstract class TreeBuilder {
List(ValDef(mods, vname, tpt, matchExpr))
case _ =>
val tmp = freshName(pat1.pos)
- val firstDef = ValDef(Modifiers(PRIVATE | LOCAL | SYNTHETIC), tmp, TypeTree(), matchExpr)
+ val firstDef = ValDef(Modifiers(PRIVATE | LOCAL | SYNTHETIC | (mods.flags & LAZY)), tmp, TypeTree(), matchExpr)
var cnt = 0
val restDefs = for (val (vname, tpt) <- vars) yield {
cnt = cnt + 1
diff --git a/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala b/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala
index 9880f88ff3..620c10cdc5 100644
--- a/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala
@@ -650,12 +650,13 @@ abstract class RefChecks extends InfoTransform {
val vsym = tree.symbol
val lazyDefSym = vsym.lazyAccessor
assert(lazyDefSym != NoSymbol, vsym)
+ val ownerTransformer = new ChangeOwnerTraverser(vsym, lazyDefSym)
val lazyDef = atPos(tree.pos)(
- DefDef(lazyDefSym, vparamss =>
- if (tree.symbol.owner.isTrait) rhs // for traits, this is further tranformed in mixins
+ DefDef(lazyDefSym, vparamss => ownerTransformer(
+ if (tree.symbol.owner.isTrait) transform(rhs) // for traits, this is further tranformed in mixins
else Block(List(
- Assign(gen.mkAttributedRef(vsym), rhs)),
- gen.mkAttributedRef(vsym))))
+ Assign(gen.mkAttributedRef(vsym), transform(rhs))),
+ gen.mkAttributedRef(vsym)))))
log("Made lazy def: " + lazyDef)
typed(ValDef(vsym, EmptyTree)) :: typed(lazyDef) :: Nil
} else {
diff --git a/test/files/run/lazy-exprs.check b/test/files/run/lazy-exprs.check
index 2aaa0be3f6..e77d204251 100644
--- a/test/files/run/lazy-exprs.check
+++ b/test/files/run/lazy-exprs.check
@@ -8,3 +8,6 @@ lazy val in if condition: forced <z1>
ok
lazy val in pattern: forced LazyField
ok
+lazy val with patterns:
+x and y: xy(x, y)
+x1 and y1: x1y1(x1, y1)
diff --git a/test/files/run/lazy-exprs.scala b/test/files/run/lazy-exprs.scala
index 307915bcac..8a80423646 100644
--- a/test/files/run/lazy-exprs.scala
+++ b/test/files/run/lazy-exprs.scala
@@ -68,12 +68,23 @@ object TestExpressions {
}
}
+ lazy val (x, y) = ({print("x"); "x"}, {print("y"); "y"})
+ def testPatLazyVal {
+ println("lazy val with patterns:")
+ print("x and y: ")
+ println("(" + x + ", " + y + ")")
+ lazy val (x1, y1) = ({print("x1"); "x1"}, {print("y1"); "y1"})
+ print("x1 and y1: ")
+ println("(" + x1 + ", " + y1 + ")")
+ }
+
def test {
patmatchScrut
patmatchCase
patmatchPat
ifcond
testPatMatchField
+ testPatLazyVal
}
}