Skip to content

Commit 42f9059

Browse files
committed
Wider net on final fields.
This should exclude everything mutable. I'm open to suggestions as to what sort of final fields we can safely allow beyond these, if any.
1 parent 3da5075 commit 42f9059

File tree

3 files changed

+27
-16
lines changed

3 files changed

+27
-16
lines changed

src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1905,7 +1905,7 @@ abstract class GenJVM extends SubComponent with GenJVMUtil with GenAndroid with
19051905
((sym.rawflags & (Flags.FINAL | Flags.MODULE)) != 0)
19061906
&& !sym.enclClass.isInterface
19071907
&& !sym.isClassConstructor
1908-
&& (sym.isLazy || sym.isPrivate || !sym.isMutable) // fix for SI-3569, is it sufficient?
1908+
&& !sym.isMutable // fix for SI-3569, it is too broad?
19091909
)
19101910

19111911
mkFlags(

test/files/run/t3569.check

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
11
1
2-
private final int Test$X.x2
3-
private final int Test$X.x3
4-
private final int Test$X.x5
5-
private final int Test$X.x6
6-
private final int Test$X.x7
7-
private int Test$X.x4
2+
private final int Test$X.val1
3+
private final int Test$X.val2
4+
private final int Test$X.val3
5+
private int Test$X.lval1
6+
private int Test$X.lval2
7+
private int Test$X.lval3
8+
private int Test$X.var1
9+
private int Test$X.var2
10+
private int Test$X.var3
811
private volatile int Test$X.bitmap$priv$0
912
public int Test$X.x
1013
public volatile int Test$X.bitmap$0
11-
private int Test$Y.z1
14+
public final int Test$Y.z1
15+
public final int Test$Y.z2
1216
public int Test$Y.x
1317
public int Test$Y.y
14-
public int Test$Y.z2

test/files/run/t3569.scala

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,23 @@
11
object Test {
2+
final val bippy1 = 1
3+
final lazy val bippy2 = 2
4+
25
lazy val lv = scala.util.Random.nextInt()
36

47
class X(final var x: Int) {
5-
final private[this] var x2: Int = 0
6-
final var x3: Int = 0
7-
private[this] var x4: Int = 0
8-
final private[this] var x5: Int = 0
9-
final lazy val x6: Int = 0
10-
final private[this] lazy val x7: Int = 0
8+
final var var1: Int = 0
9+
final private var var2: Int = 0
10+
final private[this] var var3: Int = 0
11+
12+
final val val1: Int = 1
13+
final private val val2: Int = 1
14+
final private[this] val val3: Int = 1
15+
16+
final lazy val lval1: Int = 2
17+
final private lazy val lval2: Int = 2
18+
final private[this] lazy val lval3: Int = 2
1119
}
12-
case class Y(final var x: Int, final private var y: Int, var z1: Int, private var z2: Int) { }
20+
case class Y(final var x: Int, final private var y: Int, final val z1: Int, final private val z2: Int) { }
1321

1422
def f = new X(0).x += 1
1523
def main(args: Array[String]) {

0 commit comments

Comments
 (0)