diff options
author | Adriaan Moors <adriaan.moors@typesafe.com> | 2013-11-25 14:43:17 -0800 |
---|---|---|
committer | Adriaan Moors <adriaan.moors@typesafe.com> | 2013-11-25 14:43:17 -0800 |
commit | 84c096762b0cd24184bea1567a033f07909f5cff (patch) | |
tree | 2575ef38a22ea129814f5514edce4708aa8ad2ad /test/files/neg/t7872b.scala | |
parent | d19954eb94afb27ca90b3bbcfb9eecec5e85428a (diff) | |
parent | 518635385ac1ba14aa230de3e431793331300546 (diff) | |
download | scala-84c096762b0cd24184bea1567a033f07909f5cff.tar.gz scala-84c096762b0cd24184bea1567a033f07909f5cff.tar.bz2 scala-84c096762b0cd24184bea1567a033f07909f5cff.zip |
Merge pull request #3178 from retronym/ticket/7872
SI-7872 Plug a variance exploit in refinement types
Diffstat (limited to 'test/files/neg/t7872b.scala')
-rw-r--r-- | test/files/neg/t7872b.scala | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/test/files/neg/t7872b.scala b/test/files/neg/t7872b.scala new file mode 100644 index 0000000000..307a1470c5 --- /dev/null +++ b/test/files/neg/t7872b.scala @@ -0,0 +1,23 @@ +object coinv { + def up[F[+_]](fa: F[String]): F[Object] = fa + def down[F[-_]](fa: F[Object]): F[String] = fa + + up(List("hi")) + + // should not compile; `l' is unsound + def oops1 = down[({type l[-a] = List[a]})#l](List('whatever: Object)).head + "oops" + // scala> oops1 + // java.lang.ClassCastException: scala.Symbol cannot be cast to java.lang.String + // at com.nocandysw.coinv$.oops1(coinv.scala:12) + + type Stringer[-A] = A => String + down[Stringer](_.toString) + // [error] type A is contravariant, but type _ is declared covariant + // up[Stringer]("printed: " + _) + + // should not compile; `l' is unsound + def oops2 = up[({type l[+a] = Stringer[a]})#l]("printed: " + _) + // scala> oops2(Some(33)) + // java.lang.ClassCastException: scala.Some cannot be cast to java.lang.String + // at com.nocandysw.coinv$$anonfun$oops2$1.apply(coinv.scala:20) +} |