X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2FdeSugar%2FDsExpr.lhs;h=5fb0ec8f490b5d8b7cdccc79cd1b2ef0be6bee29;hb=af20907ae1c9901b457cbab57e9d533e66e5aa07;hp=a93b1d7461738c710969cf0aa218ebe16c90b36e;hpb=0fa697bca153468bf073aad1fe02d5b4055059f2;p=ghc-hetmet.git diff --git a/compiler/deSugar/DsExpr.lhs b/compiler/deSugar/DsExpr.lhs index a93b1d7..5fb0ec8 100644 --- a/compiler/deSugar/DsExpr.lhs +++ b/compiler/deSugar/DsExpr.lhs @@ -14,6 +14,7 @@ import IOEnv ( ioToIOEnv ) import PrelNames ( breakpointJumpName, breakpointCondJumpName ) import TysWiredIn ( unitTy ) import TypeRep ( Type(..) ) +import TyCon ( isUnLiftedTyCon ) #endif import Match ( matchWrapper, matchSinglePat, matchEquations ) @@ -42,13 +43,13 @@ import TcHsSyn ( hsPatType, mkVanillaTuplePat ) import TcType ( tcSplitAppTy, tcSplitFunTys, tcTyConAppTyCon, tcTyConAppArgs, isUnLiftedType, Type, mkAppTy ) -import Type ( funArgTy, splitFunTys, isUnboxedTupleType, mkFunTy ) +import Type ( splitFunTys, isUnboxedTupleType, mkFunTy ) import CoreSyn import CoreUtils ( exprType, mkIfThenElse, bindNonRec ) import CostCentre ( mkUserCC ) import Id ( Id, idType, idName, idDataCon ) -import PrelInfo ( rEC_CON_ERROR_ID, iRREFUT_PAT_ERROR_ID ) +import PrelInfo ( rEC_CON_ERROR_ID ) import DataCon ( DataCon, dataConWrapId, dataConFieldLabels, dataConInstOrigArgTys ) import DataCon ( isVanillaDataCon ) import TyCon ( FieldLabel, tyConDataCons ) @@ -84,7 +85,9 @@ dsValBinds (ValBindsOut binds _) body = foldrDs ds_val_bind body binds ------------------------- dsIPBinds (IPBinds ip_binds dict_binds) body = do { prs <- dsLHsBinds dict_binds - ; let inner = foldr (\(x,r) e -> Let (NonRec x r) e) body prs + ; let inner = Let (Rec prs) body + -- The dict bindings may not be in + -- dependency order; hence Rec ; foldrDs ds_ip_bind inner ip_binds } where ds_ip_bind (L _ (IPBind n e)) body @@ -216,7 +219,7 @@ dsExpr expr@(HsLam a_Match) dsExpr (HsApp (L _ (HsApp realFun@(L _ (HsCoerce _ fun)) (L loc arg))) _) | HsVar funId <- fun , idName funId `elem` [breakpointJumpName, breakpointCondJumpName] - , ids <- filter (not.hasTyVar.idType) (extractIds arg) + , ids <- filter (isValidType . idType) (extractIds arg) = do dsWarn (text "Extracted ids:" <+> ppr ids <+> ppr (map idType ids)) stablePtr <- ioToIOEnv $ newStablePtr ids -- Yes, I know... I'm gonna burn in hell. @@ -234,12 +237,13 @@ dsExpr (HsApp (L _ (HsApp realFun@(L _ (HsCoerce _ fun)) (L loc arg))) _) = error (showSDoc (ppr ts)) -- argId:extractIds (unLoc fn) extractIds x = [] extractHVals ids = ExplicitList unitTy (map (L loc . HsVar) ids) - hasTyVar (TyVarTy _) = True - hasTyVar (FunTy a b) = hasTyVar a || hasTyVar b - hasTyVar (NoteTy _ t) = hasTyVar t - hasTyVar (AppTy a b) = hasTyVar a || hasTyVar b - hasTyVar (TyConApp _ ts) = any hasTyVar ts - hasTyVar _ = False + -- checks for tyvars and unlifted kinds. + isValidType (TyVarTy _) = False + isValidType (FunTy a b) = isValidType a && isValidType b + isValidType (NoteTy _ t) = isValidType t + isValidType (AppTy a b) = isValidType a && isValidType b + isValidType (TyConApp con ts) = not (isUnLiftedTyCon con) && all isValidType ts + isValidType _ = True #endif dsExpr expr@(HsApp fun arg)