isDataTyCon advertises that it's true of "data types that are
definitely represented by heap-allocated constructors. These are
srcutinised by Core-level @case@ expressions, and they get info tables
allocated for them."
Type-family TyCons never have this property, not even data type families.
It's the *instance* TyCons that do.
I hope that this change does not break anything that somehow relied
on the old (wrong) semantics.
Refinement, emptyRefinement, isEmptyRefinement,
gadtRefine,
refineType, refinePred, refineResType,
Refinement, emptyRefinement, isEmptyRefinement,
gadtRefine,
refineType, refinePred, refineResType,
tcUnifyTys, BindFlag(..)
) where
tcUnifyTys, BindFlag(..)
) where
fixpt = mapVarEnv (substTy (mkTvSubst in_scope fixpt)) env
----------------------------
fixpt = mapVarEnv (substTy (mkTvSubst in_scope fixpt)) env
----------------------------
-dataConCanMatch :: [Type] -> DataCon -> Bool
--- Returns True iff the data con can match a scrutinee of type (T tys)
--- where T is the type constructor for the data con
---
--- Instantiate the equations and try to unify them
-dataConCanMatch tys con
- | null eq_spec = True -- Common
- | all isTyVarTy tys = True -- Also common
- | otherwise
- = isJust (tcUnifyTys (\tv -> BindMe)
- (map (substTyVar subst . fst) eq_spec)
- (map snd eq_spec))
- where
- dc_tvs = dataConUnivTyVars con
- eq_spec = dataConEqSpec con
- subst = zipTopTvSubst dc_tvs tys
-
-----------------------------
tryToBind :: TyVarSet -> TyVar -> BindFlag
tryToBind tv_set tv | tv `elemVarSet` tv_set = BindMe
| otherwise = AvoidMe
tryToBind :: TyVarSet -> TyVar -> BindFlag
tryToBind tv_set tv | tv `elemVarSet` tv_set = BindMe
| otherwise = AvoidMe
-- True for all @data@ types
-- False for newtypes
-- unboxed tuples
-- True for all @data@ types
-- False for newtypes
-- unboxed tuples
+-- type families
+--
+-- NB: for a data type family, T, only the *instance* tycons are
+-- get an info table etc. The family tycon does not.
+-- Hence False for OpenTyCon
isDataTyCon tc@(AlgTyCon {algTcRhs = rhs})
= case rhs of
isDataTyCon tc@(AlgTyCon {algTcRhs = rhs})
= case rhs of
- OpenTyCon {} -> not (otIsNewtype rhs)
DataTyCon {} -> True
NewTyCon {} -> False
AbstractTyCon -> False -- We don't know, so return False
DataTyCon {} -> True
NewTyCon {} -> False
AbstractTyCon -> False -- We don't know, so return False