blob: 4f24712201962f203e08bcc2d2e62528fcc02a9f (
plain) (
blame)
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
object Single {
var i = 0
def isEmpty = false
def get = i
def unapply(a: Single.type) = this
}
object Product {
var i = 0
def _1: Int = i
def _2: String = ???
def productArity = 2
def unapply(a: Product.type) = this
def isEmpty = false
def get: this.type = this
}
object Sequence {
var i = 0
def apply(n: Int): Int = i
def length = 2
def unapplySeq(a: Sequence.type) = this
def isEmpty = false
def get = this
}
object Test {
def main(args: Array[String]): Unit = {
def assertZero(i: Int) = assert(i == 0)
Single match {
case Single(i) =>
Single.i = 1
assertZero(i) // fails under -optimize
}
Product match {
case Product(i, _) =>
Product.i = 1
assertZero(i) // fails under -optimize
}
Sequence match {
case Sequence(i, _ @ _*) =>
Sequence.i = 1
assertZero(i) // okay
}
Sequence.i = 0
Sequence match {
case Sequence(_, i) =>
Sequence.i = 1
assertZero(i) // okay
}
val buffer = collection.mutable.Buffer(0, 0)
buffer match {
case Seq(_, i) =>
buffer(1) = 1
assertZero(i) // failed
}
case class CaseSequence(as: Int*)
val buffer1 = collection.mutable.Buffer(0, 0)
CaseSequence(buffer1: _*) match {
case CaseSequence(_, i) =>
buffer1(1) = 1
assertZero(i) // failed
}
}
}
|