merge GHC HEAD
[ghc-hetmet.git] / compiler / basicTypes / IdInfo.lhs
index 9dda37e..c106f53 100644 (file)
@@ -10,7 +10,7 @@ Haskell. [WDP 94/11])
 \begin{code}
 module IdInfo (
         -- * The IdDetails type
-       IdDetails(..), pprIdDetails,
+       IdDetails(..), pprIdDetails, coVarDetails,
 
         -- * The IdInfo type
        IdInfo,         -- Abstract
@@ -46,6 +46,7 @@ module IdInfo (
        
        -- ** The SpecInfo type
        SpecInfo(..),
+       emptySpecInfo,
        isEmptySpecInfo, specInfoFreeVars,
        specInfoRules, seqSpecInfo, setSpecInfoHead,
         specInfo, setSpecInfo,
@@ -128,11 +129,20 @@ data IdDetails
 
   | 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
+
+coVarDetails :: IdDetails
+coVarDetails = VanillaId
 
 instance Outputable IdDetails where
     ppr = pprIdDetails
@@ -148,8 +158,9 @@ pprIdDetails other     = brackets (pp other)
    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)"))