object ExhaustivityWarnBugReportMinimal { //sealed is needed for the warning sealed trait FoundNode[T]/*presence of parameters is irrelevant*/ // This also causes a warning: // sealed abstract class FoundNode[T]/*presence of parameters is irrelevant*/ case class FoundFilter[T](/*presence of parameters is irrelevant*/) extends FoundNode[T] case class FoundTypeCase[T](/*presence of parameters is irrelevant*/) extends FoundNode[T] val f: Some[_] = ??? f match { case x: Some[t] => //no warning } //With these variants, no warnings: //val v: (Some[Int], FoundNode[_]) = (???, ???) //val v: (Some[AnyRef], FoundNode[_]) = (???, ???) //val v: (Some[String], FoundNode[_]) = (???, ???) val v: (Some[_], FoundNode[_]) = (???, ???) //Warning here: v match { case (x: Some[t], _: FoundNode[_]) => } v match { case (x: Some[t], _) => } v match { case (x: Some[_], _) => } case class Foo[T]() val vp: (Foo[_], FoundNode[_]) = (???, ???) vp match { case (x: Foo[_], _) => } //No warning here: v match { case (Some(y), _) => } v match { case (x, _) => } val v2: (Some[_], Int) = (???, ???) v2 match { case (x: Some[t], _) => } val v3: (Option[_], FoundNode[_]) = (???, ???) v match { case (x: Option[_], _) => } }