-- ** The SpecInfo type
SpecInfo(..),
+ emptySpecInfo,
isEmptySpecInfo, specInfoFreeVars,
specInfoRules, seqSpecInfo, setSpecInfoHead,
specInfo, setSpecInfo,
| TickBoxOpId TickBoxOp -- ^ The 'Id' is for a HPC tick box (both traditional and binary)
- | DFunId Bool -- ^ A dictionary function.
- -- True <=> the class has only one method, so may be
- -- implemented with a newtype, so it might be bad
- -- to be strict on this dictionary
-
+ | DFunId Int Bool -- ^ A dictionary function.
+ -- Int = the number of "silent" arguments to the dfun
+ -- e.g. class D a => C a where ...
+ -- instance C a => C [a]
+ -- has is_silent = 1, because the dfun
+ -- has type dfun :: (D a, C a) => C [a]
+ -- See the DFun Superclass Invariant in TcInstDcls
+ --
+ -- Bool = True <=> the class has only one method, so may be
+ -- implemented with a newtype, so it might be bad
+ -- to be strict on this dictionary
instance Outputable IdDetails where
ppr = pprIdDetails
pp (PrimOpId _) = ptext (sLit "PrimOp")
pp (FCallId _) = ptext (sLit "ForeignCall")
pp (TickBoxOpId _) = ptext (sLit "TickBoxOp")
- pp (DFunId b) = ptext (sLit "DFunId") <>
- ppWhen b (ptext (sLit "(newtype)"))
+ pp (DFunId ns nt) = ptext (sLit "DFunId")
+ <> ppWhen (ns /= 0) (brackets (int ns))
+ <> ppWhen nt (ptext (sLit "(nt)"))
pp (RecSelId { sel_naughty = is_naughty })
= brackets $ ptext (sLit "RecSel")
<> ppWhen is_naughty (ptext (sLit "(naughty)"))
setUnfoldingInfo :: IdInfo -> Unfolding -> IdInfo
setUnfoldingInfo info uf
- = seqUnfolding uf `seq` -- This seq makes a BIG difference to Trac #4367
+ = -- We don't seq the unfolding, as we generate intermediate
+ -- unfoldings which are just thrown away, so evaluating them is a
+ -- waste of time.
+ -- seqUnfolding uf `seq`
info { unfoldingInfo = uf }
setArityInfo :: IdInfo -> ArityInfo -> IdInfo