// slightly overkill, but a good test case for implicit resolution in extractor calls,
// along with the real fix: an extractor pattern with 1 sub-pattern should type check for all extractors
// that return Option[T], whatever T (even if it's a tuple)
object Foo {
  def unapply[S, T](scrutinee: S)(implicit witness: FooHasType[S, T]): Option[T] = scrutinee match {
    case i: Int => Some((i, i).asInstanceOf[T])
  }
}

class FooHasType[S, T]
object FooHasType {
  implicit object int extends FooHasType[Int, (Int, Int)]
}

// resurrected from neg/t997
object Foo997 { def unapply(x : String): Option[(String, String)] = Some((x, x)) }

object Test extends App {
  val x = 8
  println(x match {
    case Foo(p) => p // p should be a pair of Int
  })

  // Prints '(x, x)'
  "x" match { case Foo997(a) => println(a) }
}