1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
import scala.annotation.switch
object Test extends App {
// TODO: should not emit a switch
// def noSwitch(ch: Char, eof: Boolean) = (ch: @switch) match {
// case 'a' if eof => println("a with oef") // then branch
// }
def onlyThen(ch: Char, eof: Boolean) = (ch: @switch) match {
case 'a' if eof => println("a with oef") // then branch
case 'c' =>
}
def ifThenElse(ch: Char, eof: Boolean) = (ch: @switch) match {
case 'a' if eof => println("a with oef") // then branch
case 'a' if eof => println("a with oef2") // unreachable, but the analysis is not that sophisticated
case 'a' => println("a") // else-branch
case 'c' =>
}
def defaultUnguarded(ch: Char, eof: Boolean) = (ch: @switch) match {
case ' ' if eof => println("spacey oef")
case _ => println("default")
}
def defaults(ch: Char, eof: Boolean) = (ch: @switch) match {
case _ if eof => println("def with oef") // then branch
case _ if eof => println("def with oef2") // unreachable, but the analysis is not that sophisticated
case _ => println("def") // else-branch
}
// test binders in collapsed cases (no need to run, it's "enough" to know it doesn't crash the compiler)
def guard(x: Any): Boolean = true
def testBinders =
try { println("") } // work around SI-6015
catch {
case _ if guard(null) =>
case x if guard(x) => throw x
}
// def unreachable(ch: Char) = (ch: @switch) match {
// case 'a' => println("b") // ok
// case 'a' => println("b") // unreachable
// case 'c' =>
// }
// noSwitch('a', true)
onlyThen('a', true) // 'a with oef'
ifThenElse('a', true) // 'a with oef'
ifThenElse('a', false) // 'a'
defaults('a', true) // 'def with oef'
defaults('a', false) // 'def'
// test that it jumps to default case, no match error
defaultUnguarded(' ', false) // default
}
|