diff options
author | Adriaan Moors <adriaan.moors@epfl.ch> | 2012-07-06 04:29:11 -0700 |
---|---|---|
committer | Adriaan Moors <adriaan.moors@epfl.ch> | 2012-07-06 04:29:11 -0700 |
commit | 12e1a9a5826e6b76687d65520929f41c9498777b (patch) | |
tree | 797876e5ef1df9659c5c2320716c0144ac5f6763 /test | |
parent | 2ac953769f090dd71f3a77bdc8eda134ada36d94 (diff) | |
parent | 069dd892d2da02673e1cb5169b82a87336352244 (diff) | |
download | scala-12e1a9a5826e6b76687d65520929f41c9498777b.tar.gz scala-12e1a9a5826e6b76687d65520929f41c9498777b.tar.bz2 scala-12e1a9a5826e6b76687d65520929f41c9498777b.zip |
Merge pull request #824 from adriaanm/ticket-4691_6008
[SI-4691, SI-6008] improve patmat analyses: irrefutable user-defined extractors, no-op type tests
Diffstat (limited to 'test')
-rw-r--r-- | test/files/neg/exhausting.check | 2 | ||||
-rw-r--r-- | test/files/neg/t4691_exhaust_extractor.check | 13 | ||||
-rw-r--r-- | test/files/neg/t4691_exhaust_extractor.flags | 1 | ||||
-rw-r--r-- | test/files/neg/t4691_exhaust_extractor.scala | 33 | ||||
-rw-r--r-- | test/files/pos/t6008.flags | 1 | ||||
-rw-r--r-- | test/files/pos/t6008.scala | 12 |
6 files changed, 61 insertions, 1 deletions
diff --git a/test/files/neg/exhausting.check b/test/files/neg/exhausting.check index 7140b99428..0f0d13cb33 100644 --- a/test/files/neg/exhausting.check +++ b/test/files/neg/exhausting.check @@ -7,7 +7,7 @@ It would fail on the following input: Nil def fail2[T](xs: List[T]) = xs match { ^ exhausting.scala:32: error: match may not be exhaustive. -It would fail on the following input: List(<not in (1, 2)>) +It would fail on the following input: List((x: Int forSome x not in (1, 2))) def fail3a(xs: List[Int]) = xs match { ^ exhausting.scala:39: error: match may not be exhaustive. diff --git a/test/files/neg/t4691_exhaust_extractor.check b/test/files/neg/t4691_exhaust_extractor.check new file mode 100644 index 0000000000..cd12e56f86 --- /dev/null +++ b/test/files/neg/t4691_exhaust_extractor.check @@ -0,0 +1,13 @@ +t4691_exhaust_extractor.scala:17: error: match may not be exhaustive. +It would fail on the following input: Bar3() + def f1(x: Foo) = x match { + ^ +t4691_exhaust_extractor.scala:23: error: match may not be exhaustive. +It would fail on the following input: Bar3() + def f2(x: Foo) = x match { + ^ +t4691_exhaust_extractor.scala:29: error: match may not be exhaustive. +It would fail on the following input: Bar3() + def f3(x: Foo) = x match { + ^ +three errors found diff --git a/test/files/neg/t4691_exhaust_extractor.flags b/test/files/neg/t4691_exhaust_extractor.flags new file mode 100644 index 0000000000..e8fb65d50c --- /dev/null +++ b/test/files/neg/t4691_exhaust_extractor.flags @@ -0,0 +1 @@ +-Xfatal-warnings
\ No newline at end of file diff --git a/test/files/neg/t4691_exhaust_extractor.scala b/test/files/neg/t4691_exhaust_extractor.scala new file mode 100644 index 0000000000..c68c33d654 --- /dev/null +++ b/test/files/neg/t4691_exhaust_extractor.scala @@ -0,0 +1,33 @@ +sealed trait Foo +class Bar1 extends Foo +class Bar2 extends Foo +class Bar3 extends Foo + +// these extractors are known to always succeed as they return a Some +object Baz1 { + def unapply(x: Bar1): Some[Int] = Some(1) +} +object Baz2 { + def unapply(x: Bar2): Some[Int] = Some(2) +} + + +object Test { + // warning: missing Bar3 + def f1(x: Foo) = x match { + case _: Bar1 => 1 + case _: Bar2 => 2 + } + + // warning: missing Bar3 + def f2(x: Foo) = x match { + case _: Bar1 => 1 + case Baz2(x) => x + } + + // warning: missing Bar3 + def f3(x: Foo) = x match { + case Baz1(x) => x + case Baz2(x) => x + } +}
\ No newline at end of file diff --git a/test/files/pos/t6008.flags b/test/files/pos/t6008.flags new file mode 100644 index 0000000000..e8fb65d50c --- /dev/null +++ b/test/files/pos/t6008.flags @@ -0,0 +1 @@ +-Xfatal-warnings
\ No newline at end of file diff --git a/test/files/pos/t6008.scala b/test/files/pos/t6008.scala new file mode 100644 index 0000000000..84ae19b211 --- /dev/null +++ b/test/files/pos/t6008.scala @@ -0,0 +1,12 @@ +// none of these should complain about exhaustivity +class Test { + // It would fail on the following inputs: (_, false), (_, true) + def x(in: (Int, Boolean)) = in match { case (i: Int, b: Boolean) => 3 } + + // There is no warning if the Int is ignored or bound without an explicit type: + def y(in: (Int, Boolean)) = in match { case (_, b: Boolean) => 3 } + + // Keeping the explicit type for the Int but dropping the one for Boolean presents a spurious warning again: + // It would fail on the following input: (_, _) + def z(in: (Int, Boolean)) = in match { case (i: Int, b) => 3 } +}
\ No newline at end of file |