diff options
-rw-r--r-- | src/compiler/scala/tools/nsc/ast/parser/TreeBuilder.scala | 2 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/RefChecks.scala | 9 | ||||
-rw-r--r-- | test/files/run/lazy-exprs.check | 3 | ||||
-rw-r--r-- | test/files/run/lazy-exprs.scala | 11 |
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 } } |