summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid MacIver <david.maciver@gmail.com>2008-10-25 12:16:03 +0000
committerDavid MacIver <david.maciver@gmail.com>2008-10-25 12:16:03 +0000
commit98abb80c3cd862d81fe41ea299b96f44f5de91d3 (patch)
tree899ffdf59e4f8a68e679f17751a4e5bd35e8267a
parent79a47b92e0dfafc0d0a4dbb898a2548a2e84d75a (diff)
downloadscala-98abb80c3cd862d81fe41ea299b96f44f5de91d3.tar.gz
scala-98abb80c3cd862d81fe41ea299b96f44f5de91d3.tar.bz2
scala-98abb80c3cd862d81fe41ea299b96f44f5de91d3.zip
Fixed 1424.
-rw-r--r--src/compiler/scala/tools/nsc/matching/ParallelMatching.scala19
-rw-r--r--test/files/run/t1424.check1
-rw-r--r--test/files/run/t1424.scala8
3 files changed, 23 insertions, 5 deletions
diff --git a/src/compiler/scala/tools/nsc/matching/ParallelMatching.scala b/src/compiler/scala/tools/nsc/matching/ParallelMatching.scala
index 6a02957e3e..02495dd61a 100644
--- a/src/compiler/scala/tools/nsc/matching/ParallelMatching.scala
+++ b/src/compiler/scala/tools/nsc/matching/ParallelMatching.scala
@@ -43,11 +43,20 @@ trait ParallelMatching {
def MixtureRule(scrutinee: Symbol, column: List[Tree], rest: Rep)(implicit rep: RepFactory): RuleApplication = {
def isSimpleSwitch: Boolean = {
+ val simpleSwitchCandidate = (tree : Tree) => strip2(tree) match {
+ case Literal(const : Constant) if isNumeric(const.tag) =>
+ const.tag match {
+ case FloatTag | DoubleTag | LongTag => false;
+ case _ => true;
+ }
+ case _ => false;
+ }
+
(isSameType(scrutinee.tpe.widen, definitions.IntClass.tpe) ||
isSameType(scrutinee.tpe.widen, definitions.CharClass.tpe)) &&
- column.init.forall(h => strip2(h).isInstanceOf[Literal]) && {
+ column.init.forall(simpleSwitchCandidate) && {
val last = column.last;
- last.isInstanceOf[Literal] || isDefaultPattern(last);
+ simpleSwitchCandidate(last) || isDefaultPattern(last);
}}
// an unapply for which we don't need a type test
@@ -327,11 +336,11 @@ trait ParallelMatching {
myBindVars(varMap, orig)
}
- /*block*/{
+ {
var xs = column
var i = 0;
var last = -1;
- while(xs ne Nil) { // forall
+ while(xs ne Nil) {
if (last != -1) {
cunit.error(xs.head.pos, "unreachable code")
}
@@ -348,7 +357,7 @@ trait ParallelMatching {
i += 1
xs = xs.tail
}
- }/*end block*/
+ }
final def tree(implicit theOwner: Symbol, failTree: Tree): Tree = {
val (branches, defaultV, defaultRepOpt) = this.getTransition // tag body pairs
diff --git a/test/files/run/t1424.check b/test/files/run/t1424.check
new file mode 100644
index 0000000000..d00491fd7e
--- /dev/null
+++ b/test/files/run/t1424.check
@@ -0,0 +1 @@
+1
diff --git a/test/files/run/t1424.scala b/test/files/run/t1424.scala
new file mode 100644
index 0000000000..83c35a46bd
--- /dev/null
+++ b/test/files/run/t1424.scala
@@ -0,0 +1,8 @@
+object Test extends Application{
+ val x = 1 match {
+ case 0xFFFFFFFF00000001L => println("Oops, overflow!");
+ case 2L => println(2);
+ case 1L => println(1);
+ case _ => println("????");
+ }
+}