@@ -391,7 +391,7 @@ object ProtoTypes {
391
391
* - t2 is a ascription (t22: T) and t1 is at the outside of t22
392
392
* - t2 is a closure (...) => t22 and t1 is at the outside of t22
393
393
*/
394
- def hasInnerErrors (t : Tree , argType : Option [ Type ] )(using Context ): Boolean = t match
394
+ def hasInnerErrors (t : Tree , argType : Type )(using Context ): Boolean = t match
395
395
case Typed (expr, tpe) => hasInnerErrors(expr, argType)
396
396
case closureDef(mdef) => hasInnerErrors(mdef.rhs, argType)
397
397
case _ =>
@@ -402,14 +402,17 @@ object ProtoTypes {
402
402
typr.println(i " error subtree $t1 of $t with ${t1.typeOpt}, spans = ${t1.span}, ${t.span}" )
403
403
t1.typeOpt match
404
404
case errorType : ErrorType if errorType.msg.isInstanceOf [TypeMismatchMsg ] =>
405
+ // if error is caused by an argument type mismatch,
406
+ // then return false to try to find an extension.
407
+ // see i20335.scala for test case.
405
408
val typeMismtachMsg = errorType.msg.asInstanceOf [TypeMismatchMsg ]
406
- ! argType.contains( typeMismtachMsg.expected)
409
+ argType != typeMismtachMsg.expected
407
410
case _ => true
408
411
else
409
412
false
410
413
}
411
414
412
- private def cacheTypedArg (arg : untpd.Tree , typerFn : untpd.Tree => Tree , force : Boolean , argType : Option [ Type ] )(using Context ): Tree = {
415
+ private def cacheTypedArg (arg : untpd.Tree , typerFn : untpd.Tree => Tree , force : Boolean , argType : Type )(using Context ): Tree = {
413
416
var targ = state.typedArg(arg)
414
417
if (targ == null )
415
418
untpd.functionWithUnknownParamType(arg) match {
@@ -455,7 +458,7 @@ object ProtoTypes {
455
458
val protoTyperState = ctx.typerState
456
459
val oldConstraint = protoTyperState.constraint
457
460
val args1 = args.mapWithIndexConserve((arg, idx) =>
458
- cacheTypedArg(arg, arg => typer.typed(norm(arg, idx)), force = false , None ))
461
+ cacheTypedArg(arg, arg => typer.typed(norm(arg, idx)), force = false , NoType ))
459
462
val newConstraint = protoTyperState.constraint
460
463
461
464
if ! args1.exists(arg => isUndefined(arg.tpe)) then state.typedArgs = args1
@@ -503,7 +506,7 @@ object ProtoTypes {
503
506
val targ = cacheTypedArg(arg,
504
507
typer.typedUnadapted(_, wideFormal, locked)(using argCtx),
505
508
force = true ,
506
- Some ( wideFormal) )
509
+ wideFormal)
507
510
val targ1 = typer.adapt(targ, wideFormal, locked)
508
511
if wideFormal eq formal then targ1
509
512
else checkNoWildcardCaptureForCBN(targ1)
0 commit comments