diff options
author | Jason Zaugg <jzaugg@gmail.com> | 2013-11-22 18:35:43 +0100 |
---|---|---|
committer | Jason Zaugg <jzaugg@gmail.com> | 2013-11-27 09:09:46 +0100 |
commit | 28d3390e07715b0dcb5ce2f68d72d5a44e6ca74d (patch) | |
tree | 8ac9461aa99fd6a2d6b7a937d0459ed8b9c84653 /test/pending | |
parent | 073ebbd20ce9775260b83a78ecf9ed6a3e6d3d9e (diff) | |
download | scala-28d3390e07715b0dcb5ce2f68d72d5a44e6ca74d.tar.gz scala-28d3390e07715b0dcb5ce2f68d72d5a44e6ca74d.tar.bz2 scala-28d3390e07715b0dcb5ce2f68d72d5a44e6ca74d.zip |
SI-2066 Plug a soundness hole higher order type params, overriding
PolyType-s parameterized by higher order type parameters (HOTPs)
should only be relatable with <:< or =:= if the variances of their
type parameters line up. This is only enforced for HOTPs defined in
method type arguments.
Invariant type parameters subsume variant ones. Concretely, as
described by @S11001001:
> A method taking [F[_]] can implement a method taking [F[+_]].
> Likewise, a method taking [F[_[+_]]] can implement a method
> taking [F[_[_]]], as with [F[_[_[_]]]] implementing [F[_[_[+_]]]],
> and so on, the variance subsumption flipping at each step.
>
> This is just the opposite of the variance for passing type
> parameters to either instantiate types or call methods; a F[+_]
> is a suitable F[_]-argument, a F[_[_]] a suitable F[_[+_]]-argument,
> and so on.
>
> All of the above rules can be duplicated for contravariant positions
> by substituting - for +. Also, something similar happens for
> weakening/strengthening bounds, I believe.
These cases are tested in the `// okay` lines in `neg/t2066.scala`.
Diffstat (limited to 'test/pending')
-rw-r--r-- | test/pending/neg/t2066.scala | 16 |
1 files changed, 0 insertions, 16 deletions
diff --git a/test/pending/neg/t2066.scala b/test/pending/neg/t2066.scala deleted file mode 100644 index 46177b19f7..0000000000 --- a/test/pending/neg/t2066.scala +++ /dev/null @@ -1,16 +0,0 @@ -object Test extends App { - trait A { - def f[T[_]](x : T[Int]) : T[Any] - } - - class B extends A { - def f[T[+_]](x : T[Int]) : T[Any] = x - } - - class P[Y](var y : Y) - - val p = new P(1) - val palias = (new B():A).f[P](p) - palias.y = "hello" - val z: Int = p.y -}
\ No newline at end of file |