@@ -38,13 +38,13 @@ object ProtoTypes {
38
38
def isCompatible (tp : Type , pt : Type )(using Context ): Boolean =
39
39
(tp.widenExpr relaxed_<:< pt.widenExpr) || viewExists(tp, pt)
40
40
41
- /** Like isCompatibe, but using a subtype comparison with necessary eithers
42
- * that don't unnecessarily truncate the constraint space, returning false instead.
41
+ /** Like normalize and then isCompatible, but using a subtype comparison with
42
+ * necessary eithers that does not unnecessarily truncate the constraint space,
43
+ * returning false instead.
43
44
*/
44
45
def necessarilyCompatible (tp : Type , pt : Type )(using Context ): Boolean =
45
- val tpw = tp.widenExpr
46
- val ptw = pt.widenExpr
47
- necessarySubType(tpw, ptw) || tpw.isValueSubType(ptw) || viewExists(tp, pt)
46
+ val tpn = normalize(tp, pt, followIFT = ! defn.isContextFunctionType(pt))
47
+ necessarySubType(tpn, pt) || tpn.isValueSubType(pt) || viewExists(tpn, pt)
48
48
49
49
/** Test compatibility after normalization.
50
50
* Do this in a fresh typerstate unless `keepConstraint` is true.
@@ -84,9 +84,9 @@ object ProtoTypes {
84
84
case _ => true
85
85
}
86
86
case _ : ValueTypeOrProto if ! disregardProto(pt) =>
87
- necessarilyCompatible(normalize(mt, pt) , pt)
87
+ necessarilyCompatible(mt , pt)
88
88
case pt : WildcardType if pt.optBounds.exists =>
89
- necessarilyCompatible(normalize(mt, pt) , pt)
89
+ necessarilyCompatible(mt , pt)
90
90
case _ =>
91
91
true
92
92
}
@@ -607,7 +607,7 @@ object ProtoTypes {
607
607
* of toString method. The problem is solved by dereferencing nullary method types if the corresponding
608
608
* function type is not compatible with the prototype.
609
609
*/
610
- def normalize (tp : Type , pt : Type )(using Context ): Type = {
610
+ def normalize (tp : Type , pt : Type , followIFT : Boolean = true )(using Context ): Type = {
611
611
Stats .record(" normalize" )
612
612
tp.widenSingleton match {
613
613
case poly : PolyType =>
@@ -632,7 +632,7 @@ object ProtoTypes {
632
632
normalize(et.resultType, pt)
633
633
case wtp =>
634
634
val iftp = defn.asContextFunctionType(wtp)
635
- if iftp.exists then normalize(iftp.dropDependentRefinement.argInfos.last, pt)
635
+ if iftp.exists && followIFT then normalize(iftp.dropDependentRefinement.argInfos.last, pt)
636
636
else tp
637
637
}
638
638
}
0 commit comments