summaryrefslogtreecommitdiff
path: root/test/files/run/checked.scala
diff options
context:
space:
mode:
authorIulian Dragos <jaguarul@gmail.com>2008-07-28 18:05:50 +0000
committerIulian Dragos <jaguarul@gmail.com>2008-07-28 18:05:50 +0000
commit90200957ca0beb4db24555a2563d0a902de0078d (patch)
tree77ad1d2465b247d5df397e7e744d5a2bff459801 /test/files/run/checked.scala
parent8bacd7cf469bd3097070e74e8bb72010403d21e6 (diff)
downloadscala-90200957ca0beb4db24555a2563d0a902de0078d.tar.gz
scala-90200957ca0beb4db24555a2563d0a902de0078d.tar.bz2
scala-90200957ca0beb4db24555a2563d0a902de0078d.zip
Added -Ycheckinit, which causes all getters to ...
Added -Ycheckinit, which causes all getters to check that fields are initialized before being used. It reuses the same machinery (and bitmaps) as lazy values. For now it requires the new initialization order (-Xexperimental) to work.
Diffstat (limited to 'test/files/run/checked.scala')
-rw-r--r--test/files/run/checked.scala115
1 files changed, 115 insertions, 0 deletions
diff --git a/test/files/run/checked.scala b/test/files/run/checked.scala
new file mode 100644
index 0000000000..a20b819353
--- /dev/null
+++ b/test/files/run/checked.scala
@@ -0,0 +1,115 @@
+/* Test checked initializers. Needs to be run with -Xexperimental and -checkinit
+ */
+
+// 0 inherited fields
+class A {
+ val x = 1
+ val y = 2
+ var z = 3
+}
+
+// 3 inherited fields
+class B extends A {
+ val b1 = 1
+ var b2 = 2
+}
+
+
+trait T {
+ val t1 = 1
+ var t2 = 2
+}
+
+// Should not throw
+class D extends B with T {
+ val sum = x + y + z + b1 + b2 + t1 + t2
+ override def toString =
+ "sum = " + sum
+
+}
+
+abstract class NeedsXEarly {
+ val x: Int
+ val y = x + 1
+}
+
+// should pass
+class GoodX extends { val x = 1 } with NeedsXEarly {
+}
+
+// should throw
+class BadX extends NeedsXEarly {
+ val x = 1
+ println(y)
+}
+
+// should pass
+class UglyX extends NeedsXEarly {
+ lazy val x = 1
+ println(y)
+}
+
+trait XY {
+ val x = 1
+ val y = 2
+}
+
+// needs x and y early
+trait LazyFields {
+ lazy val lz1 = 1
+ lazy val lz2 = 2
+ val x: Int
+ val y: Int
+ val needsSomeEarly = {
+ println("x = " + x)
+ println("y = " + y)
+ println("lz1 = " + lz1)
+ println("lz2 = " + lz2)
+ x + y + lz1 + lz2
+ }
+}
+
+// will fail at init
+class BadMixin extends LazyFields with XY {
+ println("[OK]: " + needsSomeEarly)
+}
+
+// should print 24
+class GoodMixin extends {
+ override val x = 10
+ override val y = 11
+ } with LazyFields with XY {
+ println("[OK]: " + needsSomeEarly)
+}
+
+class TestInterference extends {
+ override val x = 10
+ override val y = 11
+} with A with T with LazyFields {
+ println("[OK]: " + needsSomeEarly)
+}
+
+
+object Test extends Application {
+
+ def shouldThrow(t: => Unit) = try {
+ t
+ println("[FAIL]: No UFE thrown")
+ } catch {
+ case UninitializedFieldError(msg) =>
+ println("[OK] Cought UFE: " + msg)
+ }
+
+
+ val d = new D()
+ println(d)
+
+ shouldThrow(new BadX)
+ (new GoodX)
+ (new UglyX)
+
+ shouldThrow(new BadMixin)
+ (new GoodMixin)
+
+ (new TestInterference)
+}