summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLukas Rytz <lukas.rytz@gmail.com>2014-05-09 16:47:56 +0200
committerLukas Rytz <lukas.rytz@gmail.com>2014-05-09 18:52:45 +0200
commitf0c33206bc125cf4326a340e2cd7c7ec2f360726 (patch)
tree660b6fe5099ee061c79ce89fcb8ea00691c95daf
parent908ccd9feea072b4ed249db5f2741f745b42ca75 (diff)
downloadscala-f0c33206bc125cf4326a340e2cd7c7ec2f360726.tar.gz
scala-f0c33206bc125cf4326a340e2cd7c7ec2f360726.tar.bz2
scala-f0c33206bc125cf4326a340e2cd7c7ec2f360726.zip
SI-8570 set the checkinit bit for unit-typed fields of traits
Fix only, refactoring in subsequent commit.
-rw-r--r--src/compiler/scala/tools/nsc/transform/Mixin.scala9
-rw-r--r--test/files/run/t8570.flags1
-rw-r--r--test/files/run/t8570.scala10
-rw-r--r--test/files/run/t8570a.check1
-rw-r--r--test/files/run/t8570a.flags1
-rw-r--r--test/files/run/t8570a.scala14
6 files changed, 33 insertions, 3 deletions
diff --git a/src/compiler/scala/tools/nsc/transform/Mixin.scala b/src/compiler/scala/tools/nsc/transform/Mixin.scala
index 673bc04bd9..9c9008bfcc 100644
--- a/src/compiler/scala/tools/nsc/transform/Mixin.scala
+++ b/src/compiler/scala/tools/nsc/transform/Mixin.scala
@@ -1042,15 +1042,18 @@ abstract class Mixin extends InfoTransform with ast.TreeDSL {
// add accessor definitions
addDefDef(sym, {
if (sym.isSetter) {
+ val getter = sym.getter(clazz)
+ def setInitFlag = mkSetFlag(clazz, fieldOffset(getter), getter, bitmapKind(getter))
if (isOverriddenSetter(sym)) UNIT
else accessedRef match {
- case ref @ Literal(_) => ref
+ case ref @ Literal(_) =>
+ if (!needsInitFlag(getter)) ref
+ else Block(setInitFlag, ref)
case ref =>
val init = Assign(ref, Ident(sym.firstParam))
- val getter = sym.getter(clazz)
if (!needsInitFlag(getter)) init
- else Block(init, mkSetFlag(clazz, fieldOffset(getter), getter, bitmapKind(getter)), UNIT)
+ else Block(init, setInitFlag, UNIT)
}
}
else if (needsInitFlag(sym))
diff --git a/test/files/run/t8570.flags b/test/files/run/t8570.flags
new file mode 100644
index 0000000000..3d1ee4760a
--- /dev/null
+++ b/test/files/run/t8570.flags
@@ -0,0 +1 @@
+-Xcheckinit
diff --git a/test/files/run/t8570.scala b/test/files/run/t8570.scala
new file mode 100644
index 0000000000..bbe83e9080
--- /dev/null
+++ b/test/files/run/t8570.scala
@@ -0,0 +1,10 @@
+trait Trait40_1 {
+ val value37_2 = ()
+ def run = { value37_2 }
+}
+
+object Test {
+ def main(args: Array[String]) {
+ (new Trait40_1 {}).run
+ }
+}
diff --git a/test/files/run/t8570a.check b/test/files/run/t8570a.check
new file mode 100644
index 0000000000..6a452c185a
--- /dev/null
+++ b/test/files/run/t8570a.check
@@ -0,0 +1 @@
+()
diff --git a/test/files/run/t8570a.flags b/test/files/run/t8570a.flags
new file mode 100644
index 0000000000..3d1ee4760a
--- /dev/null
+++ b/test/files/run/t8570a.flags
@@ -0,0 +1 @@
+-Xcheckinit
diff --git a/test/files/run/t8570a.scala b/test/files/run/t8570a.scala
new file mode 100644
index 0000000000..ef116e2a8a
--- /dev/null
+++ b/test/files/run/t8570a.scala
@@ -0,0 +1,14 @@
+trait Trait40_1 {
+ val value37_2 = ()
+ def run = { value37_2 }
+}
+
+trait T1 extends Trait40_1 {
+ override val value37_2 = ()
+}
+
+object Test {
+ def main(args: Array[String]) {
+ println((new T1 {}).run)
+ }
+}