File tree 3 files changed +57
-80
lines changed
compiler/src/dotty/tools/dotc/core 3 files changed +57
-80
lines changed Original file line number Diff line number Diff line change @@ -2757,34 +2757,6 @@ class TrackingTypeComparer(initctx: Context) extends TypeComparer(initctx) {
2757
2757
case _ =>
2758
2758
cas
2759
2759
}
2760
- def widenAbstractTypes (tp : Type ): Type = new TypeMap {
2761
- var seen = Set [TypeParamRef ]()
2762
- def apply (tp : Type ) = tp match {
2763
- case tp : TypeRef =>
2764
- tp.info match {
2765
- case info : MatchAlias =>
2766
- mapOver(tp)
2767
- // TODO: We should follow the alias in this case, but doing so
2768
- // risks infinite recursion
2769
- case TypeBounds (lo, hi) =>
2770
- if (hi frozen_<:< lo) {
2771
- val alias = apply(lo)
2772
- if (alias ne lo) alias else mapOver(tp)
2773
- }
2774
- else WildcardType
2775
- case _ =>
2776
- mapOver(tp)
2777
- }
2778
- case tp : TypeLambda =>
2779
- val saved = seen
2780
- seen ++= tp.paramRefs
2781
- try mapOver(tp)
2782
- finally seen = saved
2783
- case tp : TypeVar if ! tp.isInstantiated => WildcardType
2784
- case tp : TypeParamRef if ! seen.contains(tp) => WildcardType
2785
- case _ => mapOver(tp)
2786
- }
2787
- }.apply(tp)
2788
2760
2789
2761
val defn .MatchCase (pat, body) = cas1
2790
2762
@@ -2799,8 +2771,6 @@ class TrackingTypeComparer(initctx: Context) extends TypeComparer(initctx) {
2799
2771
body
2800
2772
}
2801
2773
}
2802
- else if (isSubType(widenAbstractTypes(scrut), widenAbstractTypes(pat)))
2803
- Some (NoType )
2804
2774
else if (provablyDisjoint(scrut, pat))
2805
2775
// We found a proof that `scrut` and `pat` are incompatible.
2806
2776
// The search continues.
Original file line number Diff line number Diff line change
1
+ final class X
2
+ final class Y
3
+
4
+ object Test3 {
5
+ type Bar [A ] = A match {
6
+ case X => String
7
+ case Y => Int
8
+ }
9
+
10
+ trait XX {
11
+ type Foo
12
+
13
+ val a : Bar [X & Foo ] = " hello"
14
+ val b : Bar [Y & Foo ] = 1
15
+
16
+ def apply (fa : Bar [X & Foo ]): Bar [Y & Foo ]
17
+
18
+ def boom : Int = apply(a)
19
+ }
20
+
21
+ trait YY extends XX {
22
+ type Foo = X & Y
23
+
24
+ def apply (fa : Bar [X & Foo ]): Bar [Y & Foo ] = fa // error
25
+ // overriding method apply in trait XX of type (fa: String): Int;
26
+ // method apply of type (fa: String): String has incompatible type
27
+ }
28
+ (new YY {}).boom
29
+ }
30
+
31
+ object Test4 {
32
+ type Bar [A ] = A match {
33
+ case X => String
34
+ case Y => Int
35
+ }
36
+
37
+ trait XX {
38
+ type Foo
39
+ type FooAlias = Foo
40
+
41
+ val a : Bar [X & FooAlias ] = " hello"
42
+ val b : Bar [Y & FooAlias ] = 1
43
+
44
+ def apply (fa : Bar [X & FooAlias ]): Bar [Y & FooAlias ]
45
+
46
+ def boom : Int = apply(a)
47
+ }
48
+
49
+ trait YY extends XX {
50
+ type Foo = X & Y
51
+
52
+ def apply (fa : Bar [X & FooAlias ]): Bar [Y & FooAlias ] = fa // error
53
+ // overriding method apply in trait XX of type (fa: String): Int;
54
+ // method apply of type (fa: String): String has incompatible type
55
+ }
56
+ (new YY {}).boom
57
+ }
Original file line number Diff line number Diff line change @@ -46,53 +46,3 @@ object Test2 {
46
46
def right (fa : Bar [L ]): Int = fa // error
47
47
}
48
48
}
49
-
50
-
51
- object Test3 {
52
- type Bar [A ] = A match {
53
- case X => String
54
- case Y => Int
55
- }
56
-
57
- trait XX {
58
- type Foo
59
-
60
- val a : Bar [X & Foo ] = " hello"
61
- val b : Bar [Y & Foo ] = 1 // error
62
-
63
- def apply (fa : Bar [X & Foo ]): Bar [Y & Foo ]
64
-
65
- def boom : Int = apply(a) // error
66
- }
67
-
68
- trait YY extends XX {
69
- type Foo = X & Y
70
-
71
- def apply (fa : Bar [X & Foo ]): Bar [Y & Foo ] = fa
72
- }
73
- }
74
-
75
- object Test4 {
76
- type Bar [A ] = A match {
77
- case X => String
78
- case Y => Int
79
- }
80
-
81
- trait XX {
82
- type Foo
83
- type FooAlias = Foo
84
-
85
- val a : Bar [X & FooAlias ] = " hello"
86
- val b : Bar [Y & FooAlias ] = 1 // error
87
-
88
- def apply (fa : Bar [X & FooAlias ]): Bar [Y & FooAlias ]
89
-
90
- def boom : Int = apply(a) // error
91
- }
92
-
93
- trait YY extends XX {
94
- type Foo = X & Y
95
-
96
- def apply (fa : Bar [X & FooAlias ]): Bar [Y & FooAlias ] = fa
97
- }
98
- }
You can’t perform that action at this time.
0 commit comments