X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=compiler%2Ftypecheck%2FTcTyDecls.lhs;h=9b0e681ba841b1667f77c8d4bb750f2f5e052dc3;hp=e39b8707a15e9d93f4ccf95d7ada5c14d9bf431c;hb=59fa6266f00b6edcfc20c491c8de9a1b215dfa22;hpb=fb54e7be395ac278f979dc542e93e7830632c07b diff --git a/compiler/typecheck/TcTyDecls.lhs b/compiler/typecheck/TcTyDecls.lhs index e39b870..9b0e681 100644 --- a/compiler/typecheck/TcTyDecls.lhs +++ b/compiler/typecheck/TcTyDecls.lhs @@ -31,6 +31,8 @@ import Digraph import BasicTypes import SrcLoc import Outputable +import Util ( isSingleton ) +import List ( partition ) \end{code} @@ -232,9 +234,18 @@ calcRecFlags boot_details tyclss -- loop. We could program round this, but it'd make the code -- rather less nice, so I'm not going to do that yet. + single_con_tycons = filter (isSingleton . tyConDataCons) all_tycons + -- Both newtypes and data types, with exactly one data constructor + (new_tycons, prod_tycons) = partition isNewTyCon single_con_tycons + -- NB: we do *not* call isProductTyCon because that checks + -- for vanilla-ness of data constructors; and that depends + -- on empty existential type variables; and that is figured + -- out by tcResultType; which uses tcMatchTy; which uses + -- coreView; which calls coreExpandTyCon_maybe; which uses + -- the recursiveness of the TyCon. Result... a black hole. + -- YUK YUK YUK + --------------- Newtypes ---------------------- - new_tycons = filter isNewTyConAndNotOpen all_tycons - isNewTyConAndNotOpen tycon = isNewTyCon tycon && not (isOpenTyCon tycon) nt_loop_breakers = mkNameSet (findLoopBreakers nt_edges) is_rec_nt tc = tyConName tc `elemNameSet` nt_loop_breakers -- is_rec_nt is a locally-used helper function @@ -252,9 +263,6 @@ calcRecFlags boot_details tyclss | otherwise = [] --------------- Product types ---------------------- - -- The "prod_tycons" are the non-newtype products - prod_tycons = [tc | tc <- all_tycons, - not (isNewTyCon tc), isProductTyCon tc] prod_loop_breakers = mkNameSet (findLoopBreakers prod_edges) prod_edges = [(tc, mk_prod_edges tc) | tc <- prod_tycons]