aboutsummaryrefslogblamecommitdiff
path: root/tests/untried/neg/t7872b.scala
blob: e76145cce9293a57f83df769369a1c4b45583a84 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11


                                                
 
                
 




                                                                                     
 



                                                                      
 





                                                                                
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)
}