summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdriaan Moors <adriaan.moors@epfl.ch>2012-05-24 11:33:34 +0200
committerAdriaan Moors <adriaan.moors@epfl.ch>2012-05-28 12:58:03 +0200
commitfddd576b1183e394cdfb47f074fe7918a37644b6 (patch)
tree6600969e7bf4af33c5d65cbeef3db92e5dd1b813
parentbcc82808ecf056affecf11b14f3ad850ad21d773 (diff)
downloadscala-fddd576b1183e394cdfb47f074fe7918a37644b6.tar.gz
scala-fddd576b1183e394cdfb47f074fe7918a37644b6.tar.bz2
scala-fddd576b1183e394cdfb47f074fe7918a37644b6.zip
don't check exhaustivity involving user-defined unapplySeq
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/PatternMatching.scala1
-rw-r--r--test/files/neg/patmatexhaust.check6
-rw-r--r--test/files/pos/exhaustive_heuristics.scala12
3 files changed, 13 insertions, 6 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/PatternMatching.scala b/src/compiler/scala/tools/nsc/typechecker/PatternMatching.scala
index 4d66fb5617..b9aa2c73fd 100644
--- a/src/compiler/scala/tools/nsc/typechecker/PatternMatching.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/PatternMatching.scala
@@ -1973,6 +1973,7 @@ trait PatternMatching extends Transform with TypingTransformers with ast.TreeDSL
case Some(0) if testedBinder.tpe.typeSymbol == ListClass => // extractor.symbol.owner == SeqFactory
EqualityCond(binderToUniqueTree(p.prevBinder), unique(Ident(NilModule) setType NilModule.tpe))
case _ =>
+ backoff = true
super.treeMakerToCond(tm)
}
case ExtractorTreeMaker(_, _, _, _) =>
diff --git a/test/files/neg/patmatexhaust.check b/test/files/neg/patmatexhaust.check
index 6172811e13..1168f36e11 100644
--- a/test/files/neg/patmatexhaust.check
+++ b/test/files/neg/patmatexhaust.check
@@ -18,10 +18,6 @@ patmatexhaust.scala:53: error: match may not be exhaustive.
It would fail on the following input: Gp()
def ma5(x:Deep) = x match {
^
-patmatexhaust.scala:59: error: match may not be exhaustive.
-It would fail on the following input: Nil
- def ma6() = List(1,2) match { // give up
- ^
patmatexhaust.scala:75: error: match may not be exhaustive.
It would fail on the following input: B()
def ma9(x: B) = x match {
@@ -38,4 +34,4 @@ patmatexhaust.scala:126: error: match may not be exhaustive.
It would fail on the following input: C1()
def ma10(x: C) = x match { // not exhaustive: C1 is not abstract.
^
-10 errors found
+9 errors found
diff --git a/test/files/pos/exhaustive_heuristics.scala b/test/files/pos/exhaustive_heuristics.scala
index f6bea455a5..297900510b 100644
--- a/test/files/pos/exhaustive_heuristics.scala
+++ b/test/files/pos/exhaustive_heuristics.scala
@@ -12,5 +12,15 @@ object Test {
case _ if turnOffChecks =>
}
- // TODO: we back off when there are any user-defined extractors
+ // we back off when there are any user-defined extractors
+ // in fact this is exhaustive, but we pretend we don't know since List's unapplySeq is not special to the compiler
+ // to compensate our ignorance, we back off
+ // well, in truth, we do rewrite List() to Nil, but otherwise we do nothing
+ // the full rewrite List(a, b) to a :: b :: Nil, for example is planned (but not sure it's a good idea)
+ List(true, false) match {
+ case List(_, _, _*) =>
+ case List(node, _*) =>
+ case Nil =>
+ }
+
} \ No newline at end of file