+ mk_eqn (clas_name, tycon_name)
+ = tcLookupClass clas_name `thenNF_Tc` \ clas ->
+ tcLookupTyCon tycon_name `thenNF_Tc` \ tycon ->
+ let
+ clas_key = classKey clas
+ tyvars = tyConTyVars tycon
+ tyvar_tys = mkTyVarTys tyvars
+ ty = mkTyConApp tycon tyvar_tys
+ data_cons = tyConDataCons tycon
+ locn = getSrcLoc tycon
+ constraints = extra_constraints ++ concat (map mk_constraints data_cons)
+
+ -- "extra_constraints": see notes above about contexts on data decls
+ extra_constraints
+ | offensive_class = tyConTheta tycon
+ | otherwise = []
+
+ offensive_class = clas_key `elem` needsDataDeclCtxtClassKeys
+
+ mk_constraints data_con
+ = [ (clas, [arg_ty])
+ | arg_ty <- dataConArgTys data_con tyvar_tys,
+ not (isUnboxedType arg_ty) -- No constraints for unboxed types?
+ ]
+ in
+ case chk_out clas tycon of