summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2010-04-29 13:12:20 +0000
committerMartin Odersky <odersky@gmail.com>2010-04-29 13:12:20 +0000
commit8a6e20ce4c14bb2f3c0bc98e8e69aa2ef891aa3b (patch)
tree873b7a4f3ebd855ff76701e1b9b07c558cc78fbb
parentd6178b3a1037fcad01e98f4e5cc9e77a51dbabbd (diff)
downloadscala-8a6e20ce4c14bb2f3c0bc98e8e69aa2ef891aa3b.tar.gz
scala-8a6e20ce4c14bb2f3c0bc98e8e69aa2ef891aa3b.tar.bz2
scala-8a6e20ce4c14bb2f3c0bc98e8e69aa2ef891aa3b.zip
Tightened variances check. Review by prokopec.
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/RefChecks.scala3
-rw-r--r--test/files/neg/variances.check13
-rw-r--r--test/files/neg/variances.scala8
3 files changed, 18 insertions, 6 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala b/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala
index bd8482cd67..ea4109bd3a 100644
--- a/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala
@@ -593,7 +593,8 @@ abstract class RefChecks extends InfoTransform {
case SingleType(pre, sym) =>
validateVariance(pre, variance)
case TypeRef(pre, sym, args) =>
- if (sym.isAliasType && relativeVariance(sym) == AnyVariance)
+// println("validate "+sym+" at "+relativeVariance(sym))
+ if (sym.isAliasType/* && relativeVariance(sym) == AnyVariance*/)
validateVariance(tp.normalize, variance)
else if (sym.variance != NoVariance) {
val v = relativeVariance(sym)
diff --git a/test/files/neg/variances.check b/test/files/neg/variances.check
index e6abdcbb53..6acd9470b6 100644
--- a/test/files/neg/variances.check
+++ b/test/files/neg/variances.check
@@ -1,13 +1,16 @@
-variances.scala:4: error: covariant type A occurs in contravariant position in type test.Vector[A] of value x
+/home/odersky/workspace/scala/test/files/neg/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]
^
-variances.scala:14: error: covariant type A occurs in contravariant position in type A of value a
+/home/odersky/workspace/scala/test/files/neg/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 supertype test.C[A] with ScalaObject of object Baz
+/home/odersky/workspace/scala/test/files/neg/variances.scala:16: error: covariant type A occurs in invariant position in supertype test.C[A] with ScalaObject of object Baz
object Baz extends C[A]
^
-variances.scala:63: error: covariant type A occurs in contravariant position in type => test.Covariant.T[A]{def m: (A) => A} of value x
+/home/odersky/workspace/scala/test/files/neg/variances.scala:63: error: covariant type A occurs in contravariant position in type => test.Covariant.T[A]{def m: (A) => A} of value x
val x: T[A] {
^
-four errors found
+/home/odersky/workspace/scala/test/files/neg/variances.scala:79: error: covariant type T occurs in contravariant position in type => test.TestAlias.B[C.this.A] of method foo
+ def foo: B[A]
+ ^
+5 errors found
diff --git a/test/files/neg/variances.scala b/test/files/neg/variances.scala
index 67783bc4aa..181783f48a 100644
--- a/test/files/neg/variances.scala
+++ b/test/files/neg/variances.scala
@@ -71,3 +71,11 @@ object Covariant {
val t: T[Any] = ST
t.x.m(new Object)
}
+
+object TestAlias {
+ class B[-T]
+ trait C[+T] {
+ type A = T
+ def foo: B[A]
+ }
+}