@@ -936,7 +936,7 @@ class Typer extends Namer
936
936
* def double(x: Char): String = s"$x$x"
937
937
* "abc" flatMap double
938
938
*/
939
- private def decomposeProtoFunction (pt : Type , defaultArity : Int )(using Context ): (List [Type ], untpd.Tree ) = {
939
+ private def decomposeProtoFunction (pt : Type , defaultArity : Int , tree : untpd. Tree )(using Context ): (List [Type ], untpd.Tree ) = {
940
940
def typeTree (tp : Type ) = tp match {
941
941
case _ : WildcardType => untpd.TypeTree ()
942
942
case _ => untpd.TypeTree (tp)
@@ -947,7 +947,15 @@ class Typer extends Namer
947
947
newTypeVar(apply(bounds.orElse(TypeBounds .empty)).bounds)
948
948
case _ => mapOver(t)
949
949
}
950
- pt.stripTypeVar.dealias match {
950
+ val pt1 = pt.stripTypeVar.dealias
951
+ if (pt1 ne pt1.dropDependentRefinement)
952
+ && defn.isContextFunctionType(pt1.nonPrivateMember(nme.apply).info.finalResultType)
953
+ then
954
+ ctx.error(
955
+ i """ Implementation restriction: Expected result type $pt1
956
+ |is a curried dependent context function type. Such types are not yet supported. """ ,
957
+ tree.sourcePos)
958
+ pt1 match {
951
959
case pt1 if defn.isNonRefinedFunction(pt1) =>
952
960
// if expected parameter type(s) are wildcards, approximate from below.
953
961
// if expected result type is a wildcard, approximate from above.
@@ -960,7 +968,7 @@ class Typer extends Namer
960
968
else
961
969
typeTree(restpe))
962
970
case tp : TypeParamRef =>
963
- decomposeProtoFunction(ctx.typerState.constraint.entry(tp).bounds.hi, defaultArity)
971
+ decomposeProtoFunction(ctx.typerState.constraint.entry(tp).bounds.hi, defaultArity, tree )
964
972
case _ =>
965
973
(List .tabulate(defaultArity)(alwaysWildcardType), untpd.TypeTree ())
966
974
}
@@ -1251,7 +1259,7 @@ class Typer extends Namer
1251
1259
typedMatchFinish(tree, tpd.EmptyTree , defn.ImplicitScrutineeTypeRef , cases1, pt)
1252
1260
}
1253
1261
else {
1254
- val (protoFormals, _) = decomposeProtoFunction(pt, 1 )
1262
+ val (protoFormals, _) = decomposeProtoFunction(pt, 1 , tree )
1255
1263
val checkMode =
1256
1264
if (pt.isRef(defn.PartialFunctionClass )) desugar.MatchCheck .None
1257
1265
else desugar.MatchCheck .Exhaustive
0 commit comments