// scalac: -Werror
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 { // was: "It would fail on the following inputs: (_, FoundFilter()), (_, FoundTypeCase())"
    case (x: Some[t], _: FoundNode[_]) =>
  }
  v match { // was: "It would fail on the following input: (_, _)"
    case (x: Some[t], _) =>
  }

  v match { // was: "It would fail on the following input: (_, _)"
    case (x: Some[_], _) =>
  }
  case class Foo[T]()

  val vp: (Foo[_], FoundNode[_]) = (???, ???)
  vp match { // was: "It would fail on the following input: (_, _)"
    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[_], _) =>
  }
}

Add some tuple + inexhaustive retroactive tests
Add some tuple + inexhaustive retroactive tests
