@@ -45,7 +45,14 @@ object ProtoTypes {
45
45
}
46
46
if (keepConstraint)
47
47
tp.widenSingleton match {
48
- case poly : PolyType => normalizedCompatible(tp, pt, keepConstraint = false )
48
+ case poly : PolyType =>
49
+ // We can't keep the constraint in this case, since we have to add type parameters
50
+ // to it, but there's no place to associate them with type variables.
51
+ // So we'd get a "inconsistent: no typevars were added to committable constraint"
52
+ // assertion failure in `constrained`. To do better, we'd have to change the
53
+ // constraint handling architecture so that some type parameters are committable
54
+ // and others are not. But that's a whole different ballgame.
55
+ normalizedCompatible(tp, pt, keepConstraint = false )
49
56
case _ => testCompat
50
57
}
51
58
else ctx.test(implicit ctx => testCompat)
@@ -246,6 +253,8 @@ object ProtoTypes {
246
253
def isMatchedBy (tp : Type , keepConstraint : Boolean )(implicit ctx : Context ): Boolean = {
247
254
val args = unforcedTypedArgs
248
255
def isPoly (tree : Tree ) = tree.tpe.widenSingleton.isInstanceOf [PolyType ]
256
+ // See remark in normalizedCompatible for why we can't keep the constraint
257
+ // if one of the arguments has a PolyType.
249
258
typer.isApplicable(tp, Nil , args, resultType, keepConstraint && ! args.exists(isPoly))
250
259
}
251
260
@@ -308,7 +317,7 @@ object ProtoTypes {
308
317
if (state.typedArgs.size == args.length) state.typedArgs
309
318
else {
310
319
val args1 = args.mapconserve(cacheTypedArg(_, typer.typed(_), force))
311
- if (! args1.contains(WildcardType )) state.typedArgs = args1
320
+ if (force || ! args1.contains(WildcardType )) state.typedArgs = args1
312
321
args1
313
322
}
314
323
0 commit comments