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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
object t1 {
trait T { def f = 1 }
trait U extends T
class C extends U { def t = super.f }
}
object t2 {
class A { def f = 1 }
trait T extends A { override def f = 2 }
class B extends A
class C extends B with T {
def t1 = super.f
def t2 = super[T].f
def t3 = super[B].f
}
}
object t3 {
class A { def f = 1 }
trait T extends A
class B extends A { override def f = 2 }
class C extends B with T {
def t1 = super.f
// def t2 = super[T].f // error: cannot emit super call (test exists)
def t3 = super[B].f
}
}
object t4 {
trait T1 { def f = 1 }
trait T2 { self: T1 => override def f = 2 }
trait U extends T1 with T2
class C extends U {
def t1 = super.f
def t2 = super[U].f
}
}
object t5 {
trait T { override def hashCode = -1 }
trait U extends T
class C extends U {
def t1 = super[U].hashCode
def t2 = super.hashCode
}
}
object t6 {
trait T { def f = 1 }
trait U1 extends T { override def f = 2 }
trait U2 extends T { override def f = 3 }
class C1 extends T with U1 with U2 {
def t1 = super.f
def t2 = super[T].f
def t3 = super[U1].f
def t4 = super[U2].f
}
class C2 extends T with U2 with U1 {
def t1 = super.f
}
}
object t7 {
trait T1 { def f = 1 }
trait T2 { _: T1 => override def f = 2 }
trait U extends T1 with T2
trait V extends U with T2
class C extends V {
def t1 = super.f
def t2 = super[V].f
}
}
object t8 {
trait HasNewBuilder { def newBuilder: Int }
trait GenericTraversableTemplate extends HasNewBuilder { def newBuilder = 0 }
trait Iterable extends GenericTraversableTemplate
trait MutMapLike extends HasNewBuilder { override def newBuilder = 1 }
trait MutMap extends Iterable with MutMapLike
class TrieMap extends MutMap with MutMapLike
}
object Test {
def e(a: Any, b: Any) = assert(a == b, s"expected: $b\ngot: $a")
def main(args: Array[String]): Unit = {
e(new t1.C().t, 1)
val c2 = new t2.C
e(c2.f, 2)
e(c2.t1, 2)
e(c2.t2, 2)
e(c2.t3, 1)
val c3 = new t3.C
e(c3.f, 2)
e(c3.t1, 2)
e(c3.t3, 2)
val c4 = new t4.C
e(c4.f, 2)
e(c4.t1, 2)
e(c4.t2, 2)
val c5 = new t5.C
e(c5.hashCode, -1)
e(c5.t1, -1)
e(c5.t2, -1)
val c6a = new t6.C1
val c6b = new t6.C2
e(c6a.f, 3)
e(c6a.t1, 3)
e(c6a.t2, 1)
e(c6a.t3, 2)
e(c6a.t4, 3)
e(c6b.f, 2)
e(c6b.t1, 2)
val c7 = new t7.C
e(c7.f, 2)
e(c7.t1, 2)
e(c7.t2, 2)
e(new t8.TrieMap().newBuilder, 1)
}
}
|