diff options
author | Martin Odersky <odersky@gmail.com> | 2014-10-17 15:35:11 +0200 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2014-10-26 16:24:00 +0100 |
commit | 3fea9472c0d068bc08ae764429ca6b4bca95bcd8 (patch) | |
tree | 06a7a208ec8e4afb1a3a964d64fb22e594c74c0c /tests/pos | |
parent | 25a8937f115ed2ac1af33c41c73a621dab4ee712 (diff) | |
download | dotty-3fea9472c0d068bc08ae764429ca6b4bca95bcd8.tar.gz dotty-3fea9472c0d068bc08ae764429ca6b4bca95bcd8.tar.bz2 dotty-3fea9472c0d068bc08ae764429ca6b4bca95bcd8.zip |
Avoid hoisting local classes
The patch disables hoisting of classes local to a block into the
result type of the block.
Instead, we widen the result type of the block to one which reflects
all refinements made to the parents type of the local class.
Test cases in avoid.scala, t1569.scala.
The original t1569.scala no longer works. Why is explained in neg/t1569-failedAvoid.scala
Diffstat (limited to 'tests/pos')
-rw-r--r-- | tests/pos/avoid.scala | 10 | ||||
-rw-r--r-- | tests/pos/t1569.scala | 5 | ||||
-rw-r--r-- | tests/pos/t1569a.scala | 12 |
3 files changed, 22 insertions, 5 deletions
diff --git a/tests/pos/avoid.scala b/tests/pos/avoid.scala new file mode 100644 index 000000000..51471feaa --- /dev/null +++ b/tests/pos/avoid.scala @@ -0,0 +1,10 @@ +abstract class C { + def y: Any +} + +object test { + val x = new C{ + def y: String = "abc" + } + val z: String = x.y +} diff --git a/tests/pos/t1569.scala b/tests/pos/t1569.scala deleted file mode 100644 index a7200a6d1..000000000 --- a/tests/pos/t1569.scala +++ /dev/null @@ -1,5 +0,0 @@ -object Bug { - class C { type T } - def foo(x: Int)(y: C)(z: y.T): Unit = {} - foo(3)(new C { type T = String })("hello") -} diff --git a/tests/pos/t1569a.scala b/tests/pos/t1569a.scala new file mode 100644 index 000000000..6cc3619a4 --- /dev/null +++ b/tests/pos/t1569a.scala @@ -0,0 +1,12 @@ +object Bug { + class C[T] { type TT = T } + def foo[U](x: Int)(y: C[U])(z: y.TT): Unit = {} + foo(3)(new C[String])("hello") +} + +object Bug2 { + class C { type T } + class D extends C { type T = String } + def foo(x: Int)(y: C)(z: y.T): Unit = {} + foo(3)(new D)("hello") +} |