// a.scala // Thu Sep 27 09:42:16 PDT 2012 trait Bar[-T1, T2, +T3] { } trait Foo[-T1, T2, +T3] extends Bar[T1, T2, T3] class A { var b = true def f1(x: Foo[Int, Int, Int]) = x match { /* nowarn */ case _: Foo[Nothing, Int, Any] => true } def f2[T, U, V](x: Foo[T, U, V]) = x match { /* nowarn */ case _: Foo[Nothing, U, Any] => true } def f3[T, U, V](x: Foo[T, U, V]) = x match { /* warn */ case _: Foo[U, U, V] if b => () /* nowarn */ case _: Foo[Nothing, U, V] if b => () /* warn */ case _: Foo[Any, U, V] if b => () } def f4(xs: List[Int]) = xs match { /* nowarn - todo */ case x: AnyRef { def bippy: Int } if b => x.bippy // this could/should do an instance check and not warn /* nowarn - todo */ case x: AnyRef { def size: Int } if b => x.size // this could/should do a static conformance test and not warn /* nowarn */ case x: ((AnyRef { def size: Int }) @unchecked) if b => x.size } }