diff options
author | Martin Odersky <odersky@gmail.com> | 2010-04-29 13:12:20 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2010-04-29 13:12:20 +0000 |
commit | 8a6e20ce4c14bb2f3c0bc98e8e69aa2ef891aa3b (patch) | |
tree | 873b7a4f3ebd855ff76701e1b9b07c558cc78fbb | |
parent | d6178b3a1037fcad01e98f4e5cc9e77a51dbabbd (diff) | |
download | scala-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.scala | 3 | ||||
-rw-r--r-- | test/files/neg/variances.check | 13 | ||||
-rw-r--r-- | test/files/neg/variances.scala | 8 |
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] + } +} |