summaryrefslogtreecommitdiff
path: root/test/files/neg/t7669.check
diff options
context:
space:
mode:
authorJason Zaugg <jzaugg@gmail.com>2013-07-16 12:06:43 +1000
committerJason Zaugg <jzaugg@gmail.com>2013-07-17 09:55:38 +1000
commit635892e34119d2e4b82fbced5b9d8cbd6dd064b7 (patch)
treed1b5586f0c53d6de258d095267f7d211aad180a0 /test/files/neg/t7669.check
parent11dcf82910b388046e675d76d277b09b931d5363 (diff)
downloadscala-635892e34119d2e4b82fbced5b9d8cbd6dd064b7.tar.gz
scala-635892e34119d2e4b82fbced5b9d8cbd6dd064b7.tar.bz2
scala-635892e34119d2e4b82fbced5b9d8cbd6dd064b7.zip
SI-7669 Fix exhaustivity warnings for recursive ADTs.
The pattern matcher's analysis was correctly finding models under which the match in the enclosed test could fail. But, when trying to render that model as a counter example, it ran into an internal inconsistency and gave up. That inconsistency arose from VariableAssignment, which: > turn the variable assignments into a tree > the root is the scrutinee (x1), edges are labelled > by the fields that are assigned a node is a variable > example (which is later turned into a counter example) In the process, it notes the unreachable case `V2 = NotHandled`, which can only arise if `V1 = Op`, ie the scrutinee is `Op(NotHandled())`. V2 is assosicated with the path `x1.arg`. The code then looked for any variable assosicated with the prefix `x1` and registered that its field `arg` was assosicated with this variable assignment. However, the assignment for `V1 = NotHandled` (another missing case) is also associated with the path `x1`. Registering this field makes no sense here; we should only do that for `Op`. This commit conditionally registers the fields based on the class of `VariableAssignment#cls`. We no longer hit the inconsistency in `VariableAssignment#allFieldAssignmentsLegal`. This favourably changes the results of two existing tests. I had to tweak the counter example pruning to avoid relying on CounterExample.==, which is flaky in the light of Nil and List(). It is possible to have: A, B where A != B && A.coveredBy(B) && B.coveredBy(A) Luckily it is straightforward to implement pruning entirely with coveredBy.
Diffstat (limited to 'test/files/neg/t7669.check')
-rw-r--r--test/files/neg/t7669.check7
1 files changed, 7 insertions, 0 deletions
diff --git a/test/files/neg/t7669.check b/test/files/neg/t7669.check
new file mode 100644
index 0000000000..c090ed18ce
--- /dev/null
+++ b/test/files/neg/t7669.check
@@ -0,0 +1,7 @@
+t7669.scala:9: warning: match may not be exhaustive.
+It would fail on the following input: NotHandled(_)
+ def exhausto(expr: Expr): Unit = expr match {
+ ^
+error: No warnings can be incurred under -Xfatal-warnings.
+one warning found
+one error found