From 12ead8d5f2317bd6df8bd6c4ed41a61f7af50650 Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Sat, 9 Jun 2018 17:26:09 +0200 Subject: [PATCH 1/3] Fix #4559: Don't force initializers of lazy mixin fields --- compiler/src/dotty/tools/dotc/transform/Mixin.scala | 2 +- tests/run/i4559.scala | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 tests/run/i4559.scala diff --git a/compiler/src/dotty/tools/dotc/transform/Mixin.scala b/compiler/src/dotty/tools/dotc/transform/Mixin.scala index 437a8a45af3c..f1e96275e034 100644 --- a/compiler/src/dotty/tools/dotc/transform/Mixin.scala +++ b/compiler/src/dotty/tools/dotc/transform/Mixin.scala @@ -214,7 +214,7 @@ class Mixin extends MiniPhase with SymTransformer { thisPhase => EmptyTree } - for (getter <- mixin.info.decls.toList if getter.isGetter && !was(getter, Deferred)) yield { + for (getter <- mixin.info.decls.toList if getter.isGetter && !was(getter, Deferred | Lazy)) yield { val isScala2x = mixin.is(Scala2x) def default = Underscore(getter.info.resultType) def initial = transformFollowing(superRef(initializer(getter)).appliedToNone) diff --git a/tests/run/i4559.scala b/tests/run/i4559.scala new file mode 100644 index 000000000000..5c382205021f --- /dev/null +++ b/tests/run/i4559.scala @@ -0,0 +1,9 @@ +trait A { + lazy val x = { println("super[A].x()"); 123 } +} + +class B extends A { + override lazy val x = 456 +} + +object Test { def main(args: Array[String]): Unit = { new B() } } From a6457fb403b44cc7d2efa935274150a4b7ddb250 Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Sat, 9 Jun 2018 18:08:20 +0200 Subject: [PATCH 2/3] Update check file --- tests/run/i4559.check | 2 ++ tests/run/i4559.scala | 5 +++-- 2 files changed, 5 insertions(+), 2 deletions(-) create mode 100644 tests/run/i4559.check diff --git a/tests/run/i4559.check b/tests/run/i4559.check new file mode 100644 index 000000000000..eabab14e3d41 --- /dev/null +++ b/tests/run/i4559.check @@ -0,0 +1,2 @@ +super[A] init +x() diff --git a/tests/run/i4559.scala b/tests/run/i4559.scala index 5c382205021f..d9b5cb2d8c8a 100644 --- a/tests/run/i4559.scala +++ b/tests/run/i4559.scala @@ -1,9 +1,10 @@ trait A { + println(s"super[A] init") lazy val x = { println("super[A].x()"); 123 } } class B extends A { - override lazy val x = 456 + override lazy val x = { println("x()"); 456 } } -object Test { def main(args: Array[String]): Unit = { new B() } } +object Test { def main(args: Array[String]): Unit = { new B().x } } From 04f5bf3288d68672427117472a344f9d63c5050e Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Sat, 9 Jun 2018 18:14:17 +0200 Subject: [PATCH 3/3] Fix the fix --- compiler/src/dotty/tools/dotc/transform/Mixin.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/compiler/src/dotty/tools/dotc/transform/Mixin.scala b/compiler/src/dotty/tools/dotc/transform/Mixin.scala index f1e96275e034..d4d798f161d0 100644 --- a/compiler/src/dotty/tools/dotc/transform/Mixin.scala +++ b/compiler/src/dotty/tools/dotc/transform/Mixin.scala @@ -214,7 +214,7 @@ class Mixin extends MiniPhase with SymTransformer { thisPhase => EmptyTree } - for (getter <- mixin.info.decls.toList if getter.isGetter && !was(getter, Deferred | Lazy)) yield { + for (getter <- mixin.info.decls.toList if getter.isGetter && !was(getter, Deferred)) yield { val isScala2x = mixin.is(Scala2x) def default = Underscore(getter.info.resultType) def initial = transformFollowing(superRef(initializer(getter)).appliedToNone) @@ -242,7 +242,7 @@ class Mixin extends MiniPhase with SymTransformer { thisPhase => // transformFollowing call is needed to make memoize & lazy vals run transformFollowing(DefDef(implementation(getter.asTerm), rhs)) } - else if (isScala2x || was(getter, ParamAccessor)) EmptyTree + else if (isScala2x || was(getter, ParamAccessor | Lazy)) EmptyTree else initial } }