summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGerard Basler <gerard.basler@gmail.com>2015-09-12 19:38:22 +0200
committerGerard Basler <gerard.basler@gmail.com>2015-09-12 19:58:08 +0200
commitbdba16f5de91c4a8ac345c345a674f4ba56b542b (patch)
treee84a64f26689407ca93c126401a21b9579bed660 /src
parent7ec4207a2fa84e7a35f514a911893b7e3cb57672 (diff)
downloadscala-bdba16f5de91c4a8ac345c345a674f4ba56b542b.tar.gz
scala-bdba16f5de91c4a8ac345c345a674f4ba56b542b.tar.bz2
scala-bdba16f5de91c4a8ac345c345a674f4ba56b542b.zip
SI-9369 Fix pattern matcher warnings for diamond shaped inheritance.
A previous optimization (d44a86f432a7f9ca250b014acdeab02ac9f2c304) for pattern matcher exhaustivity checks used a smarter encoding to ensure that the scrutinee can be equal to one child only. However, in case of traits between the root and leave type, a child can be of several types and these types should not be in a mutually exclusive group. A simple solution (hat tip to retronym) is to just put traits and classes into separate groups.
Diffstat (limited to 'src')
-rw-r--r--src/compiler/scala/tools/nsc/transform/patmat/MatchAnalysis.scala6
1 files changed, 5 insertions, 1 deletions
diff --git a/src/compiler/scala/tools/nsc/transform/patmat/MatchAnalysis.scala b/src/compiler/scala/tools/nsc/transform/patmat/MatchAnalysis.scala
index a11906ace1..1331eb6993 100644
--- a/src/compiler/scala/tools/nsc/transform/patmat/MatchAnalysis.scala
+++ b/src/compiler/scala/tools/nsc/transform/patmat/MatchAnalysis.scala
@@ -150,7 +150,11 @@ trait TreeAndTypeAnalysis extends Debugging {
acc: List[List[Type]]): List[List[Type]] = wl match {
case hd :: tl =>
val children = enumerateChildren(hd)
- groupChildren(tl ++ children, acc :+ filterChildren(children))
+ // put each trait in a new group, since traits could belong to the same
+ // group as a derived class
+ val (traits, nonTraits) = children.partition(_.isTrait)
+ val filtered = (traits.map(List(_)) ++ List(nonTraits)).map(filterChildren)
+ groupChildren(tl ++ children, acc ++ filtered)
case Nil => acc
}