summaryrefslogtreecommitdiff
path: root/test/files
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2007-06-29 17:53:23 +0000
committerMartin Odersky <odersky@gmail.com>2007-06-29 17:53:23 +0000
commita8a692413d68f752dca8f5ad7cc551a03f7f9436 (patch)
treee1bb18431fe615eaa6a65e0bd01cff2b0ab56cd6 /test/files
parent674015b30bb6191f955548b6eff705506bf5591c (diff)
downloadscala-a8a692413d68f752dca8f5ad7cc551a03f7f9436.tar.gz
scala-a8a692413d68f752dca8f5ad7cc551a03f7f9436.tar.bz2
scala-a8a692413d68f752dca8f5ad7cc551a03f7f9436.zip
fixed bug1170
Diffstat (limited to 'test/files')
-rw-r--r--test/files/neg/variances.check10
-rw-r--r--test/files/neg/variances.scala56
2 files changed, 64 insertions, 2 deletions
diff --git a/test/files/neg/variances.check b/test/files/neg/variances.check
index 7f46b656bc..ba894a439d 100644
--- a/test/files/neg/variances.check
+++ b/test/files/neg/variances.check
@@ -1,4 +1,10 @@
-variances.scala:2: error: covariant type A occurs in contravariant position in type Vector[A] of value x
+variances.scala:4: error: covariant type A occurs in contravariant position in type test.Vector[A] of value x
def append(x: Vector[A]): Vector[A]
^
-one error found
+variances.scala:14: error: covariant type A occurs in contravariant position in type A of value a
+ private[this] def setA(a : A) = this.a = a
+ ^
+variances.scala:16: error: covariant type A occurs in invariant position in type test.C[A] with ScalaObject{def this(): object Foo.this.Baz} of object Baz
+ object Baz extends C[A]
+ ^
+three errors found
diff --git a/test/files/neg/variances.scala b/test/files/neg/variances.scala
index 38d6617beb..f84ee8d5d5 100644
--- a/test/files/neg/variances.scala
+++ b/test/files/neg/variances.scala
@@ -1,5 +1,61 @@
+package test
+
trait Vector[+A] {
def append(x: Vector[A]): Vector[A]
private[this] def append3(x: Vector[A]): Vector[A] = append(x)
}
+class C[T]
+
+object Covariant {
+ class Foo[+A] {
+ private[this] var a : A = _
+ def getA : A = a
+ private[this] def setA(a : A) = this.a = a
+
+ object Baz extends C[A]
+ trait Convert[B] {
+ def b2a(b : B) : A
+ def doit(b : B) = setA(b2a(b))
+ }
+ }
+ class Foo2[+A] {
+ private[this] var a : A = _
+ def getA : A = a
+ private[this] def setA(a : A) = this.a = a
+
+ {
+ trait Convert[B] {
+ def b2a(b : B) : A
+ def doit(b : B) = setA(b2a(b))
+ }
+ ()
+ }
+ }
+ class Foo3[+A] {
+ private[this] var a : A = _
+ def getA : A = a
+ private[this] def setA(a : A) = this.a = a
+
+ private[this] trait Convert[B] {
+ def b2a(b : B) : A
+ def doit(b : B) = setA(b2a(b))
+ }
+ }
+ abstract class AbstractTest {
+ val a : Foo[AnyRef]
+ val c = new a.Convert[Int] {
+ def b2a(b : Int) : AnyRef = "hello"
+ }
+ val b : Int = 42
+ }
+ class Test extends AbstractTest {
+ val a : Foo[Character] = new Foo[Character]
+ }
+ def main(args : Array[String]) : Unit = {
+ val test = new Test
+ test.c.doit(test.b)
+ val x : Character = test.a.getA
+ Console.println("XXX " + x)
+ }
+}