aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorodersky <odersky@gmail.com>2017-01-05 17:44:48 +0700
committerGitHub <noreply@github.com>2017-01-05 17:44:48 +0700
commit2498cf9c18b5778df24ee944008ea72ff0fcab2c (patch)
treea3533127f188d03420576c7f4a7aecf2c5c1a9e4
parent3922cce7afc295f7816397ebf2d2f59446a89041 (diff)
parent63d68bf4d3cbac82f6d9faf19acd5589603a17ee (diff)
downloaddotty-2498cf9c18b5778df24ee944008ea72ff0fcab2c.tar.gz
dotty-2498cf9c18b5778df24ee944008ea72ff0fcab2c.tar.bz2
dotty-2498cf9c18b5778df24ee944008ea72ff0fcab2c.zip
Merge pull request #1879 from dotty-staging/fix-final-vars
Fix #1878: Generate fields for final vars.
-rw-r--r--compiler/src/dotty/tools/dotc/transform/Memoize.scala2
-rw-r--r--tests/run/final-var.check4
-rw-r--r--tests/run/final-var.scala20
3 files changed, 25 insertions, 1 deletions
diff --git a/compiler/src/dotty/tools/dotc/transform/Memoize.scala b/compiler/src/dotty/tools/dotc/transform/Memoize.scala
index 0314d4ec4..63edc0256 100644
--- a/compiler/src/dotty/tools/dotc/transform/Memoize.scala
+++ b/compiler/src/dotty/tools/dotc/transform/Memoize.scala
@@ -102,7 +102,7 @@ import Decorators._
case _ => t
}
skipBlocks(tree.rhs) match {
- case lit: Literal if sym.is(Final) && isIdempotentExpr(tree.rhs) =>
+ case lit: Literal if sym.is(Final, butNot = Mutable) && isIdempotentExpr(tree.rhs) =>
// duplicating scalac behavior: for final vals that have rhs as constant, we do not create a field
// and instead return the value. This seemingly minor optimization has huge effect on initialization
// order and the values that can be observed during superconstructor call
diff --git a/tests/run/final-var.check b/tests/run/final-var.check
new file mode 100644
index 000000000..7565230c0
--- /dev/null
+++ b/tests/run/final-var.check
@@ -0,0 +1,4 @@
+false
+true
+false
+true
diff --git a/tests/run/final-var.scala b/tests/run/final-var.scala
new file mode 100644
index 000000000..94a6c453c
--- /dev/null
+++ b/tests/run/final-var.scala
@@ -0,0 +1,20 @@
+object Test {
+ def main(args: Array[String]): Unit = {
+ println(Obj.myFinalVar)
+ Obj.myFinalVar = true
+ println(Obj.myFinalVar)
+
+ val o = new Cls
+ println(o.myFinalVar)
+ o.myFinalVar = true
+ println(o.myFinalVar)
+ }
+}
+
+object Obj {
+ final var myFinalVar: Boolean = false
+}
+
+class Cls {
+ final var myFinalVar: Boolean = false
+}