-
-matchConFamily (var:vars) eqns_info shadows
- = match_cons_used vars eqns_info shadows `thenDs` \ alts ->
- mkCoAlgCaseMatchResult var alts
+matchConFamily (var:vars) ty eqns_info
+ = let
+ -- Sort into equivalence classes by the unique on the constructor
+ -- All the EqnInfos should start with a ConPat
+ groups = equivClassesByUniq get_uniq eqns_info
+ get_uniq (EqnInfo { eqn_pats = ConPatOut (L _ data_con) _ _ _ _ _ : _}) = getUnique data_con
+
+ -- Get the wrapper from the head of each group. We're going to
+ -- use it as the pattern in this case expression, so we need to
+ -- ensure that any type variables it mentions in the pattern are
+ -- in scope. So we put its wrappers outside the case, and
+ -- zap the wrapper for it.
+ wraps :: [CoreExpr -> CoreExpr]
+ wraps = map (eqn_wrap . head) groups
+
+ groups' = [ eqn { eqn_wrap = idWrapper } : eqns | eqn:eqns <- groups ]
+ in
+ -- Now make a case alternative out of each group
+ mappM (match_con vars ty) groups' `thenDs` \ alts ->
+ returnDs (adjustMatchResult (foldr (.) idWrapper wraps) $
+ mkCoAlgCaseMatchResult var ty alts)