import Bag
import BasicTypes hiding ( TopLevel )
import FastString
--- import StaticFlags ( opt_DsMultiTyVar )
import Util
import MonadUtils
; let var' | inline_regardless = var `setIdUnfolding` mkCompulsoryUnfolding core_expr'
| otherwise = var
- ; return (unitOL (var', core_expr')) }
+ ; return (unitOL (makeCorePair var' False 0 core_expr')) }
dsHsBind auto_scc (FunBind { fun_id = L _ fun, fun_matches = matches
, fun_co_fn = co_fn, fun_tick = tick
where
is_local_id = isJust mb_poly_rhs
poly_rhs | Just rhs <- mb_poly_rhs
- = rhs
- | Just unfolding <- maybeUnfoldingTemplate (idUnfolding poly_id)
- = unfolding
+ = rhs -- Local Id; this is its rhs
+ | Just unfolding <- maybeUnfoldingTemplate (realIdUnfolding poly_id)
+ = unfolding -- Imported Id; this is its unfolding
+ -- Use realIdUnfolding so we get the unfolding
+ -- even when it is a loop breaker.
+ -- We want to specialise recursive functions!
| otherwise = pprPanic "dsImpSpecs" (ppr poly_id)
- -- In the Nothing case the specialisation is for an imported Id
- -- whose unfolding gives the RHS to be specialised
- -- The type checker has checked that it has an unfolding
+ -- The type checker has checked that it *has* an unfolding
specUnfolding :: (CoreExpr -> CoreExpr) -> Type
-> Unfolding -> DsM (Unfolding, OrdList (Id,CoreExpr))