Skip to content

Commit 131b36c

Browse files
committed
Some more tests
1 parent 87e651f commit 131b36c

File tree

2 files changed

+139
-2
lines changed

2 files changed

+139
-2
lines changed

tests/neg/i2973.scala

Lines changed: 68 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,68 @@
1-
class Foo[U]
2-
class Bar[-T] extends Foo[T] // error: contravariant type T occurs in invariant position
1+
import annotation.unchecked.uncheckedVariance
2+
3+
class InvClass[U]
4+
trait InvTrait[U]
5+
class ContraClass[-T]
6+
trait ContraTrait[-T]
7+
class CoClass[+T]
8+
trait CoTrait[+T]
9+
10+
class Contra[-T] extends InvClass[T] // error: contravariant type T occurs in invariant position
11+
class Co[+T] extends InvClass[T] // error
12+
13+
class ContraInvT[-T] extends InvTrait[T] // error
14+
class ContraCoT[-T] extends CoTrait[T] // error
15+
class CoInvT[+T] extends InvTrait[T] // error
16+
class CoContraT[+T] extends ContraTrait[T] // error
17+
class CoInvCoT[+T] extends InvTrait[T] with CoTrait[T] // error
18+
class CoContraCoT[+T] extends ContraTrait[T] with CoTrait[T] // error
19+
20+
class ContraContraInv[-T] extends ContraClass[T] with InvTrait[T] // error
21+
class ContraCoInv[-T] extends CoClass[T] with InvTrait[T] // error
22+
class CoCoInv[+T] extends CoClass[T] with InvTrait[T] // error
23+
24+
class ContraInvContra[-T] extends InvClass[T] with ContraTrait[T] // error
25+
class CoInvContra[+T] extends InvClass[T] with ContraTrait[T] // error
26+
class ContraInvCo[-T] extends InvClass[T] with CoTrait[T] // error
27+
class CoInvCo[+T] extends InvClass[T] with CoTrait[T] // error
28+
29+
// @uncheckedVariance but in the wrong place
30+
class ContraContraInv2[-T] extends ContraClass[T] @uncheckedVariance with InvTrait[T] // error
31+
class ContraCoInv2[-T] extends CoClass[T] @uncheckedVariance with InvTrait[T] // error
32+
33+
trait Prefix1 {
34+
trait Prefix2 {
35+
class InvClass[U]
36+
trait InvTrait[U]
37+
class ContraClass[-T]
38+
trait ContraTrait[-T]
39+
class CoClass[+T]
40+
trait CoTrait[+T]
41+
}
42+
}
43+
44+
trait Prefix3 {
45+
def f(v1: Prefix1)(v2: v1.Prefix2): Unit = {
46+
class Contra[-T] extends InvClass[T] // error: contravariant type T occurs in invariant position
47+
class Co[+T] extends InvClass[T] // error
48+
49+
class ContraInvT[-T] extends InvTrait[T] // error
50+
class ContraCoT[-T] extends CoTrait[T] // error
51+
class CoInvT[+T] extends InvTrait[T] // error
52+
class CoContraT[+T] extends ContraTrait[T] // error
53+
class CoInvCoT[+T] extends InvTrait[T] with CoTrait[T] // error
54+
class CoContraCoT[+T] extends ContraTrait[T] with CoTrait[T] // error
55+
56+
class ContraContraInv[-T] extends ContraClass[T] with InvTrait[T] // error
57+
class ContraCoInv[-T] extends CoClass[T] with InvTrait[T] // error
58+
class CoCoInv[+T] extends CoClass[T] with InvTrait[T] // error
59+
60+
class ContraInvContra[-T] extends InvClass[T] with ContraTrait[T] // error
61+
class CoInvContra[+T] extends InvClass[T] with ContraTrait[T] // error
62+
class ContraInvCo[-T] extends InvClass[T] with CoTrait[T] // error
63+
class CoInvCo[+T] extends InvClass[T] with CoTrait[T] // error
64+
65+
class ContraContraInv2[-T] extends ContraClass[T] @uncheckedVariance with InvTrait[T] // error
66+
class ContraCoInv2[-T] extends CoClass[T] @uncheckedVariance with InvTrait[T] // error
67+
}
68+
}

tests/pos/i2973.scala

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
import annotation.unchecked.uncheckedVariance
2+
3+
class InvClass[U]
4+
trait InvTrait[U]
5+
class ContraClass[-T]
6+
trait ContraTrait[-T]
7+
class CoClass[+T]
8+
trait CoTrait[+T]
9+
10+
trait Prefix1 {
11+
trait Prefix2 {
12+
class InvClass[U]
13+
trait InvTrait[U]
14+
class ContraClass[-T]
15+
trait ContraTrait[-T]
16+
class CoClass[+T]
17+
trait CoTrait[+T]
18+
}
19+
}
20+
21+
class Contra[-T] extends InvClass[T] @uncheckedVariance
22+
class Co[+T] extends InvClass[T] @uncheckedVariance
23+
24+
class ContraInvT[-T] extends InvTrait[T] @uncheckedVariance
25+
class ContraCoT[-T] extends CoTrait[T] @uncheckedVariance
26+
class CoInvT[+T] extends InvTrait[T] @uncheckedVariance
27+
class CoContraT[+T] extends ContraTrait[T] @uncheckedVariance
28+
class CoInvCoT[+T] extends InvTrait[T] @uncheckedVariance with CoTrait[T]
29+
class CoContraCoT[+T] extends ContraTrait[T] @uncheckedVariance with CoTrait[T]
30+
31+
class ContraContraInv[-T] extends ContraClass[T] with InvTrait[T] @uncheckedVariance
32+
class ContraCoInv[-T] extends CoClass[T] @uncheckedVariance with InvTrait[T] @uncheckedVariance
33+
class CoCoInv[+T] extends CoClass[T] with InvTrait[T] @uncheckedVariance
34+
35+
class ContraInvContra[-T] extends InvClass[T] @uncheckedVariance with ContraTrait[T]
36+
class CoInvContra[+T] extends InvClass[T] @uncheckedVariance with ContraTrait[T] @uncheckedVariance
37+
class ContraInvCo[-T] extends InvClass[T] @uncheckedVariance with CoTrait[T] @uncheckedVariance
38+
class CoInvCo[+T] extends InvClass[T] @uncheckedVariance with CoTrait[T]
39+
40+
// @uncheckedVariance but also in the wrong place
41+
class CoInvCoT2[+T] extends InvTrait[T] @uncheckedVariance with CoTrait[T] @uncheckedVariance
42+
class ContraContraInv2[-T] extends ContraClass[T] @uncheckedVariance with InvTrait[T] @uncheckedVariance
43+
class ContraCoInv2[-T] extends CoClass[T] @uncheckedVariance with InvTrait[T] @uncheckedVariance
44+
45+
trait Prefix3 {
46+
def f(v1: Prefix1)(v2: v1.Prefix2): Unit = {
47+
class Contra[-T] extends InvClass[T] @uncheckedVariance
48+
class Co[+T] extends InvClass[T] @uncheckedVariance
49+
50+
class ContraInvT[-T] extends InvTrait[T] @uncheckedVariance
51+
class ContraCoT[-T] extends CoTrait[T] @uncheckedVariance
52+
class CoInvT[+T] extends InvTrait[T] @uncheckedVariance
53+
class CoContraT[+T] extends ContraTrait[T] @uncheckedVariance
54+
class CoInvCoT[+T] extends InvTrait[T] @uncheckedVariance with CoTrait[T]
55+
class CoContraCoT[+T] extends ContraTrait[T] @uncheckedVariance with CoTrait[T]
56+
57+
class ContraContraInv[-T] extends ContraClass[T] with InvTrait[T] @uncheckedVariance
58+
class ContraCoInv[-T] extends CoClass[T] @uncheckedVariance with InvTrait[T] @uncheckedVariance
59+
class CoCoInv[+T] extends CoClass[T] with InvTrait[T] @uncheckedVariance
60+
61+
class ContraInvContra[-T] extends InvClass[T] @uncheckedVariance with ContraTrait[T]
62+
class CoInvContra[+T] extends InvClass[T] @uncheckedVariance with ContraTrait[T] @uncheckedVariance
63+
class ContraInvCo[-T] extends InvClass[T] @uncheckedVariance with CoTrait[T] @uncheckedVariance
64+
class CoInvCo[+T] extends InvClass[T] @uncheckedVariance with CoTrait[T]
65+
66+
// @uncheckedVariance but also in the wrong place
67+
class CoInvCoT2[+T] extends InvTrait[T] @uncheckedVariance with CoTrait[T] @uncheckedVariance
68+
class ContraContraInv2[-T] extends ContraClass[T] @uncheckedVariance with InvTrait[T] @uncheckedVariance
69+
class ContraCoInv2[-T] extends CoClass[T] @uncheckedVariance with InvTrait[T] @uncheckedVariance
70+
}
71+
}

0 commit comments

Comments
 (0)