Skip to content

Commit 7d9a288

Browse files
committed
Delay checking against expected type for eta-expanded closures
1 parent 9884855 commit 7d9a288

File tree

1 file changed

+16
-1
lines changed

1 file changed

+16
-1
lines changed

compiler/src/dotty/tools/dotc/cc/CheckCaptures.scala

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -606,8 +606,23 @@ class CheckCaptures extends Recheck, SymTransformer:
606606
// rechecking the body.
607607
openClosures = (mdef.symbol, pt) :: openClosures
608608
try
609+
def isEtaExpansion(mdef: DefDef): Boolean = mdef.paramss match
610+
case (param :: _) :: _ if param.asInstanceOf[Tree].span.isZeroExtent =>
611+
mdef.rhs match
612+
case _: Apply => true
613+
case closureDef(mdef1) => isEtaExpansion(mdef1)
614+
case _ => false
615+
case _ => false
609616
val res = recheckClosure(expr, pt, forceDependent = true)
610-
checkConformsExpr(res, pt, expr)
617+
if !isEtaExpansion(mdef) then
618+
// If closure is an eta expanded method reference it's better to not constrain
619+
// its internals early since that would give error messages in generated code
620+
// which are less intelligible.
621+
// Example is the line `a = x` in neg-custom-args/captures/vars.scala.
622+
// For all other closures, early constraints are preferred since they
623+
// give more localized error messages.
624+
checkConformsExpr(res, pt, expr)
625+
//else report.warning(i"skip test $mdef", mdef.srcPos)
611626
recheckDef(mdef, mdef.symbol)
612627
//println(i"RECHECK CLOSURE ${mdef.symbol.info}")
613628
res

0 commit comments

Comments
 (0)