@@ -254,28 +254,36 @@ constrainCase env region expr branches tipe =
254254
255255 exprCon <- constrain env expr (varN exprVar)
256256
257− (branchVars, regions, branchExprCons) <-
258− unzip3 <$> mapM (branch (varN exprVar)) branches
259−
260− let branchCons =
261− zipWith3 branchEqual [1..] branchVars regions
257+ (branchInfo, branchExprCons) <-
258+ unzip <$> mapM (branch (varN exprVar)) branches
262259
263260 return $
264− ex (exprVar:branchVars)
265− (CAnd (exprCon : branchExprCons ++ branchCons))
261+ ex (exprVar : map fst branchInfo)
262+ (CAnd (exprCon : branchExprCons ++ branchCons 2 branchInfo))
266263 where
267264 branch patternType (pattern, branchExpr@(A.A branchRegion _)) =
268265 do branchVar <- variable Flexible
269266 fragment <- Pattern.constrain env pattern patternType
270267 branchCon <- constrain env branchExpr (varN branchVar)
271268 return
272− ( branchVar
273− , branchRegion
269+ ( (branchVar, branchRegion)
274270 , CLet [Fragment.toScheme fragment] branchCon
275271 )
276272
277− branchEqual n var branchRegion =
278− CEqual (Error.CaseBranch n branchRegion) region tipe (varN var)
273+ branchCons n branchInfo =
274+ case branchInfo of
275+ [] ->
276+ []
277+
278+ (var,_) : [] ->
279+ [ CEqual Error.Case region tipe (varN var) ]
280+
281+ (var,_) : (var',region') : rest ->
282+ let
283+ hint = Error.CaseBranch n region'
284+ con = CEqual hint region (varN var) (varN var')
285+ in
286+ con : branchCons (n+1) ((var', region') : rest)
279287
280288
281289-- EXPAND PATTERNS