summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2012-03-07 13:04:45 -0800
committerPaul Phillips <paulp@improving.org>2012-03-07 13:09:15 -0800
commit02fb34822b599043b5707c78addc63dcd1c947cf (patch)
tree2be9b622285a0e179b1a5138076f43e347dae2b2
parentf2ffc5be3487ca5dc331f754897f0e9b84eeb72c (diff)
downloadscala-02fb34822b599043b5707c78addc63dcd1c947cf.tar.gz
scala-02fb34822b599043b5707c78addc63dcd1c947cf.tar.bz2
scala-02fb34822b599043b5707c78addc63dcd1c947cf.zip
Fix for public final fields.
References SI-3569. Probably needs refinement.
-rw-r--r--src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala2
-rw-r--r--test/files/run/t3569.check14
-rw-r--r--test/files/run/t3569.flags1
-rw-r--r--test/files/run/t3569.scala24
4 files changed, 41 insertions, 0 deletions
diff --git a/src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala b/src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala
index 387b7fb3d7..b3f085a934 100644
--- a/src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala
+++ b/src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala
@@ -824,6 +824,7 @@ abstract class GenJVM extends SubComponent with GenJVMUtil with GenAndroid with
def genField(f: IField) {
debuglog("Adding field: " + f.symbol.fullName)
+
val jfield = jclass.addNewField(
javaFlags(f.symbol) | javaFieldFlags(f.symbol),
javaName(f.symbol),
@@ -1904,6 +1905,7 @@ abstract class GenJVM extends SubComponent with GenJVMUtil with GenAndroid with
((sym.rawflags & (Flags.FINAL | Flags.MODULE)) != 0)
&& !sym.enclClass.isInterface
&& !sym.isClassConstructor
+ && (sym.isLazy || sym.getter.isPrivate || !sym.isMutable) // fix for SI-3569, is it sufficient?
)
mkFlags(
diff --git a/test/files/run/t3569.check b/test/files/run/t3569.check
new file mode 100644
index 0000000000..aa19916324
--- /dev/null
+++ b/test/files/run/t3569.check
@@ -0,0 +1,14 @@
+1
+private final int Test$X.x2
+private final int Test$X.x3
+private final int Test$X.x5
+private final int Test$X.x6
+private final int Test$X.x7
+private int Test$X.x4
+private volatile int Test$X.bitmap$priv$0
+public int Test$X.x
+public volatile int Test$X.bitmap$0
+private int Test$Y.z1
+public int Test$Y.x
+public int Test$Y.y
+public int Test$Y.z2
diff --git a/test/files/run/t3569.flags b/test/files/run/t3569.flags
new file mode 100644
index 0000000000..6933d924d3
--- /dev/null
+++ b/test/files/run/t3569.flags
@@ -0,0 +1 @@
+-Yinline \ No newline at end of file
diff --git a/test/files/run/t3569.scala b/test/files/run/t3569.scala
new file mode 100644
index 0000000000..e553f16ff8
--- /dev/null
+++ b/test/files/run/t3569.scala
@@ -0,0 +1,24 @@
+object Test {
+ lazy val lv = scala.util.Random.nextInt()
+
+ class X(final var x: Int) {
+ final private[this] var x2: Int = 0
+ final var x3: Int = 0
+ private[this] var x4: Int = 0
+ final private[this] var x5: Int = 0
+ final lazy val x6: Int = 0
+ final private[this] lazy val x7: Int = 0
+ }
+ case class Y(final var x: Int, final private var y: Int, var z1: Int, private var z2: Int) { }
+
+ def f = new X(0).x += 1
+ def main(args: Array[String]) {
+ f
+ val s = new X(0)
+ s.x += 1
+ println(s.x)
+
+ (classOf[X].getDeclaredFields map ("" + _)).sorted foreach println
+ (classOf[Y].getDeclaredFields map ("" + _)).sorted foreach println
+ }
+}