From a8a692413d68f752dca8f5ad7cc551a03f7f9436 Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Fri, 29 Jun 2007 17:53:23 +0000 Subject: fixed bug1170 --- test/files/neg/variances.check | 10 ++++++-- test/files/neg/variances.scala | 56 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+), 2 deletions(-) (limited to 'test/files') 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) + } +} -- cgit v1.2.3