diff --git a/src/compiler/scala/tools/nsc/transform/patmat/PatternExpansion.scala b/src/compiler/scala/tools/nsc/transform/patmat/PatternExpansion.scala index 1c8849a75637..65be1fbf47ee 100644 --- a/src/compiler/scala/tools/nsc/transform/patmat/PatternExpansion.scala +++ b/src/compiler/scala/tools/nsc/transform/patmat/PatternExpansion.scala @@ -127,7 +127,7 @@ trait PatternExpansion { // rest is private private val isUnapply = fun.symbol.name == nme.unapply private val isUnapplySeq = fun.symbol.name == nme.unapplySeq - private def isBooleanUnapply = isUnapply && unapplyResultType() =:= BooleanTpe + private def isBooleanUnapply = isUnapply && unapplyResultType() <:< BooleanTpe private def isRepeatedCaseClass = caseCtorParamTypes.exists(tpes => tpes.nonEmpty && isScalaRepeatedParamType(tpes.last)) private def caseCtorParamTypes: Option[List[Type]] = diff --git a/test/files/neg/t4425b.check b/test/files/neg/t4425b.check index baa526e92663..5fc61c575cdf 100644 --- a/test/files/neg/t4425b.check +++ b/test/files/neg/t4425b.check @@ -22,22 +22,22 @@ t4425b.scala:10: error: object X is not a case class, nor does it have a valid u Note: def unapply(x: String)(y: String): Nothing exists in object X, but it cannot be used as an extractor due to its second non-implicit parameter list println((X: Any) match { case X(_, _) => "ok" ; case _ => "fail" }) ^ -t4425b.scala:18: error: The result type of an unapply method must contain a member `get` to be used as an extractor pattern, no such member exists in Nothing +t4425b.scala:18: error: too many patterns for object X offering Boolean: expected 0, found 2 println( "" match { case _ X _ => "ok" ; case _ => "fail" }) ^ -t4425b.scala:19: error: The result type of an unapply method must contain a member `get` to be used as an extractor pattern, no such member exists in Nothing +t4425b.scala:19: error: too many patterns for object X offering Boolean: expected 0, found 2 println((X: Any) match { case _ X _ => "ok" ; case _ => "fail" }) ^ -t4425b.scala:20: error: The result type of an unapply method must contain a member `get` to be used as an extractor pattern, no such member exists in Nothing +t4425b.scala:20: error: too many patterns for object X offering Boolean: expected 0, found 1 println( "" match { case X(_) => "ok" ; case _ => "fail" }) ^ -t4425b.scala:21: error: The result type of an unapply method must contain a member `get` to be used as an extractor pattern, no such member exists in Nothing +t4425b.scala:21: error: too many patterns for object X offering Boolean: expected 0, found 1 println((X: Any) match { case X(_) => "ok" ; case _ => "fail" }) ^ -t4425b.scala:22: error: The result type of an unapply method must contain a member `get` to be used as an extractor pattern, no such member exists in Nothing +t4425b.scala:22: error: too many patterns for object X offering Boolean: expected 0, found 2 println( "" match { case X(_, _) => "ok" ; case _ => "fail" }) ^ -t4425b.scala:23: error: The result type of an unapply method must contain a member `get` to be used as an extractor pattern, no such member exists in Nothing +t4425b.scala:23: error: too many patterns for object X offering Boolean: expected 0, found 2 println((X: Any) match { case X(_, _) => "ok" ; case _ => "fail" }) ^ t4425b.scala:31: error: too many patterns for object X offering Nothing: expected 1, found 2 diff --git a/test/files/pos/t12232_.scala b/test/files/pos/t12232_.scala new file mode 100644 index 000000000000..098b62b565f3 --- /dev/null +++ b/test/files/pos/t12232_.scala @@ -0,0 +1,12 @@ +object Test { + sealed trait Foo + final class Bar extends Foo + + object Bar { + def unapply(o: Bar): true = true + } + + def f(foo: Foo) = foo match { + case Bar() => println("Bar") + } +} \ No newline at end of file