diff options
Diffstat (limited to 'test/files/run/checked.scala')
-rw-r--r-- | test/files/run/checked.scala | 115 |
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) +} |