X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2FdeSugar%2FDsBinds.lhs;h=2c6f361ca070737fa89638fcfc93b82da51f33ce;hb=9c83ea50dcfb5c5ada888cf956560df641afb130;hp=797d55e44e596ef2be10f1f0b62a743c3c16416b;hpb=7be227dcf505a16b1b63a9fe3cbea87127b70b52;p=ghc-hetmet.git diff --git a/compiler/deSugar/DsBinds.lhs b/compiler/deSugar/DsBinds.lhs index 797d55e..2c6f361 100644 --- a/compiler/deSugar/DsBinds.lhs +++ b/compiler/deSugar/DsBinds.lhs @@ -261,9 +261,10 @@ makeCorePair gbl_id is_default_method dict_arity rhs | Just arity <- inlinePragmaSat inline_prag -- Add an Unfolding for an INLINE (but not for NOINLINE) -- And eta-expand the RHS; see Note [Eta-expanding INLINE things] - = (gbl_id `setIdUnfolding` mkInlineRule rhs (Just (dict_arity + arity)), - -- NB: The arity in the InlineRule takes account of the dictionaries - etaExpand arity rhs) + , let real_arity = dict_arity + arity + -- NB: The arity in the InlineRule takes account of the dictionaries + = (gbl_id `setIdUnfolding` mkInlineRule rhs (Just real_arity), + etaExpand real_arity rhs) | otherwise = (gbl_id `setIdUnfolding` mkInlineRule rhs Nothing, rhs) @@ -461,6 +462,7 @@ dsSpecs poly_id poly_rhs prags ; spec_name <- newLocalName poly_name ; wrap_fn <- dsCoercion spec_co ; let ds_spec_expr = wrap_fn (Var poly_id) + spec_ty = exprType ds_spec_expr ; case decomposeRuleLhs ds_spec_expr of { Nothing -> do { warnDs (decomp_msg spec_co) ; return Nothing } ; @@ -472,10 +474,9 @@ dsSpecs poly_id poly_rhs prags bs | not (null bs) -> do { warnDs (dead_msg bs); return Nothing } | otherwise -> do - { (spec_unf, unf_pairs) <- specUnfolding wrap_fn (realIdUnfolding poly_id) + { (spec_unf, unf_pairs) <- specUnfolding wrap_fn spec_ty (realIdUnfolding poly_id) - ; let spec_ty = exprType ds_spec_expr - spec_id = mkLocalId spec_name spec_ty + ; let spec_id = mkLocalId spec_name spec_ty `setInlinePragma` inl_prag `setIdUnfolding` spec_unf inl_prag | isDefaultInlinePragma spec_inl = idInlinePragma poly_id @@ -510,12 +511,13 @@ dsSpecs poly_id poly_rhs prags 2 (pprHsWrapper (ppr poly_id) spec_co) -specUnfolding :: (CoreExpr -> CoreExpr) -> Unfolding -> DsM (Unfolding, [(Id,CoreExpr)]) -specUnfolding wrap_fn (DFunUnfolding con ops) +specUnfolding :: (CoreExpr -> CoreExpr) -> Type + -> Unfolding -> DsM (Unfolding, [(Id,CoreExpr)]) +specUnfolding wrap_fn spec_ty (DFunUnfolding _ _ ops) = do { let spec_rhss = map wrap_fn ops ; spec_ids <- mapM (mkSysLocalM (fsLit "spec") . exprType) spec_rhss - ; return (DFunUnfolding con (map Var spec_ids), spec_ids `zip` spec_rhss) } -specUnfolding _ _ + ; return (mkDFunUnfolding spec_ty (map Var spec_ids), spec_ids `zip` spec_rhss) } +specUnfolding _ _ _ = return (noUnfolding, []) mkArbitraryTypeEnv :: [TyVar] -> [([TyVar], a, b, c)] -> TyVarEnv Type