[project @ 1999-01-28 17:10:52 by simonpj]
[ghc-hetmet.git] / ghc / compiler / prelude / PrelInfo.lhs
index 0d16747..c1e3a9d 100644 (file)
@@ -44,7 +44,7 @@ module PrelInfo (
        -- RdrNames for lots of things, mainly used in derivings
        eq_RDR, ne_RDR, le_RDR, lt_RDR, ge_RDR, gt_RDR, max_RDR, min_RDR, 
        compare_RDR, minBound_RDR, maxBound_RDR, enumFrom_RDR, enumFromTo_RDR,
-       enumFromThen_RDR, enumFromThenTo_RDR, fromEnum_RDR, toEnum_RDR, 
+       enumFromThen_RDR, enumFromThenTo_RDR, succ_RDR, pred_RDR, fromEnum_RDR, toEnum_RDR, 
        ratioDataCon_RDR, range_RDR, index_RDR, inRange_RDR, readsPrec_RDR,
        readList_RDR, showsPrec_RDR, showList_RDR, plus_RDR, times_RDR,
        ltTag_RDR, eqTag_RDR, gtTag_RDR, eqH_Char_RDR, ltH_Char_RDR, 
@@ -58,8 +58,10 @@ module PrelInfo (
 
        numClass_RDR, fractionalClass_RDR, eqClass_RDR, 
        ccallableClass_RDR, creturnableClass_RDR,
-       monadZeroClass_RDR, enumClass_RDR, ordClass_RDR,
-       ioDataCon_RDR
+       monadClass_RDR, enumClass_RDR, ordClass_RDR,
+       ioDataCon_RDR,
+
+       mkTupConRdrName, mkUbxTupConRdrName
 
     ) where
 
@@ -77,19 +79,21 @@ import TysPrim              -- TYPES
 import TysWiredIn
 
 -- others:
-import RdrHsSyn                ( RdrName(..), varQual, tcQual, qual )
-import BasicTypes      ( IfaceFlavour )
+import RdrName         ( RdrName, mkPreludeQual )
 import Var             ( varUnique, Id )
-import Name            ( Name, OccName(..), Provenance(..),
-                         getName, mkGlobalName, modAndOcc
+import Name            ( Name, OccName, Provenance(..), 
+                         NameSpace, tcName, clsName, varName, dataName,
+                         getName, mkGlobalName, nameRdrName, systemProvenance
                        )
+import RdrName         ( rdrNameModule, rdrNameOcc, mkSrcQual )
 import Class           ( Class, classKey )
 import TyCon           ( tyConDataCons, TyCon )
 import Type            ( funTyCon )
 import Bag
 import Unique          -- *Key stuff
 import UniqFM          ( UniqFM, listToUFM, lookupWithDefaultUFM ) 
-import Util            ( isIn, panic )
+import Util            ( isIn )
+import Panic           ( panic )
 
 import IOExts
 \end{code}
@@ -168,6 +172,7 @@ prim_tycons
     , mutVarPrimTyCon
     , realWorldTyCon
     , stablePtrPrimTyCon
+    , stableNamePrimTyCon
     , statePrimTyCon
     , threadIdPrimTyCon
     , wordPrimTyCon
@@ -190,7 +195,6 @@ data_tycons
     , int64TyCon
     , integerTyCon
     , listTyCon
-    , voidTyCon
     , wordTyCon
     , word8TyCon
     , word16TyCon
@@ -209,8 +213,13 @@ data_tycons
 \begin{code}
 wired_in_ids
   = [  -- These error-y things are wired in because we don't yet have
-       -- a way to express in an inteface file that the result type variable
+       -- a way to express in an interface file that the result type variable
        -- is 'open'; that is can be unified with an unboxed type
+       -- 
+       -- [The interface file format now carry such information, but there's
+       --  no way yet of expressing at the definition site for these error-reporting
+       --  functions that they have an 'open' result type. -- sof 1/99]
+       -- 
       aBSENT_ERROR_ID
     , eRROR_ID
     , iRREFUT_PAT_ERROR_ID
@@ -249,26 +258,26 @@ thinAirIdNames
   = map mkKnownKeyGlobal
     [
        -- Needed for converting literals to Integers (used in tidyCoreExpr)
-      (varQual (pREL_BASE, SLIT("int2Integer")),  int2IntegerIdKey)    
-    , (varQual (pREL_BASE, SLIT("addr2Integer")), addr2IntegerIdKey)
+      (varQual pREL_BASE SLIT("int2Integer"),  int2IntegerIdKey)       
+    , (varQual pREL_BASE SLIT("addr2Integer"), addr2IntegerIdKey)
 
        -- OK, this is Will's idea: we should have magic values for Integers 0,
        -- +1, +2, and -1 (go ahead, fire me):
-    , (varQual (pREL_BASE, SLIT("integer_0")),  integerZeroIdKey)    
-    , (varQual (pREL_BASE, SLIT("integer_1")),  integerPlusOneIdKey) 
-    , (varQual (pREL_BASE, SLIT("integer_2")),  integerPlusTwoIdKey) 
-    , (varQual (pREL_BASE, SLIT("integer_m1")), integerMinusOneIdKey)
+    , (varQual pREL_BASE SLIT("integer_0"),  integerZeroIdKey)    
+    , (varQual pREL_BASE SLIT("integer_1"),  integerPlusOneIdKey) 
+    , (varQual pREL_BASE SLIT("integer_2"),  integerPlusTwoIdKey) 
+    , (varQual pREL_BASE SLIT("integer_m1"), integerMinusOneIdKey)
 
 
        -- String literals
-    , (varQual (pREL_PACK, SLIT("packCString#")),   packCStringIdKey)
-    , (varQual (pREL_PACK, SLIT("unpackCString#")), unpackCStringIdKey)
-    , (varQual (pREL_PACK, SLIT("unpackNBytes#")),  unpackCString2IdKey)
-    , (varQual (pREL_PACK, SLIT("unpackAppendCString#")), unpackCStringAppendIdKey)
-    , (varQual (pREL_PACK, SLIT("unpackFoldrCString#")),  unpackCStringFoldrIdKey)
+    , (varQual pREL_PACK SLIT("packCString#"),   packCStringIdKey)
+    , (varQual pREL_PACK SLIT("unpackCString#"), unpackCStringIdKey)
+    , (varQual pREL_PACK SLIT("unpackNBytes#"),  unpackCString2IdKey)
+    , (varQual pREL_PACK SLIT("unpackAppendCString#"), unpackCStringAppendIdKey)
+    , (varQual pREL_PACK SLIT("unpackFoldrCString#"),  unpackCStringFoldrIdKey)
 
        -- Folds; introduced by desugaring list comprehensions
-    , (varQual (pREL_BASE, SLIT("foldr")), foldrIdKey)
+    , (varQual pREL_BASE SLIT("foldr"), foldrIdKey)
     ]
 
 thinAirModules = [pREL_PACK]   -- See notes with RnIfaces.findAndReadIface
@@ -329,8 +338,9 @@ Ids, Synonyms, Classes and ClassOps with builtin keys.
 
 \begin{code}
 mkKnownKeyGlobal :: (RdrName, Unique) -> Name
-mkKnownKeyGlobal (Qual mod occ hif, uniq)
-  = mkGlobalName uniq mod occ NoProvenance
+mkKnownKeyGlobal (rdr_name, uniq)
+  = mkGlobalName uniq (rdrNameModule rdr_name) (rdrNameOcc rdr_name)
+                systemProvenance
 
 ioTyCon_NAME     = mkKnownKeyGlobal (ioTyCon_RDR,       ioTyConKey)
 main_NAME        = mkKnownKeyGlobal (main_RDR,          mainKey)
@@ -365,7 +375,6 @@ knownKeyNames
     , (numClass_RDR,           numClassKey)            -- mentioned, numeric
     , (enumClass_RDR,          enumClassKey)           -- derivable
     , (monadClass_RDR,         monadClassKey)
-    , (monadZeroClass_RDR,     monadZeroClassKey)
     , (monadPlusClass_RDR,     monadPlusClassKey)
     , (functorClass_RDR,       functorClassKey)
     , (showClass_RDR,          showClassKey)           -- derivable
@@ -394,7 +403,7 @@ knownKeyNames
     , (eq_RDR,                 eqClassOpKey)
     , (thenM_RDR,              thenMClassOpKey)
     , (returnM_RDR,            returnMClassOpKey)
-    , (zeroM_RDR,              zeroClassOpKey)
+    , (failM_RDR,              failMClassOpKey)
     , (fromRational_RDR,       fromRationalClassOpKey)
     
     , (deRefStablePtr_RDR,     deRefStablePtrIdKey)
@@ -434,115 +443,116 @@ These RdrNames are not really "built in", but some parts of the compiler
 to write them all down in one place.
 
 \begin{code}
-prelude_primop op = qual (modAndOcc (mkPrimitiveId op))
-
-main_RDR               = varQual (mAIN,     SLIT("main"))
-otherwiseId_RDR        = varQual (pREL_BASE, SLIT("otherwise"))
-
-intTyCon_RDR           = qual (modAndOcc intTyCon)
-ioTyCon_RDR            = tcQual  (pREL_IO_BASE, SLIT("IO"))
-ioDataCon_RDR                  = varQual (pREL_IO_BASE, SLIT("IO"))
-bindIO_RDR             = varQual (pREL_IO_BASE, SLIT("bindIO"))
-
-orderingTyCon_RDR      = tcQual (pREL_BASE, SLIT("Ordering"))
-rationalTyCon_RDR      = tcQual (pREL_NUM,  SLIT("Rational"))
-ratioTyCon_RDR         = tcQual (pREL_NUM,  SLIT("Ratio"))
-ratioDataCon_RDR       = varQual (pREL_NUM, SLIT(":%"))
-
-byteArrayTyCon_RDR             = tcQual (pREL_ARR,  SLIT("ByteArray"))
-mutableByteArrayTyCon_RDR      = tcQual (pREL_ARR,  SLIT("MutableByteArray"))
-
-foreignObjTyCon_RDR    = tcQual (pREL_IO_BASE, SLIT("ForeignObj"))
-stablePtrTyCon_RDR     = tcQual (pREL_FOREIGN, SLIT("StablePtr"))
-deRefStablePtr_RDR      = varQual (pREL_FOREIGN, SLIT("deRefStablePtr"))
-makeStablePtr_RDR       = varQual (pREL_FOREIGN, SLIT("makeStablePtr"))
-
-eqClass_RDR            = tcQual (pREL_BASE, SLIT("Eq"))
-ordClass_RDR           = tcQual (pREL_BASE, SLIT("Ord"))
-boundedClass_RDR       = tcQual (pREL_BASE, SLIT("Bounded"))
-numClass_RDR           = tcQual (pREL_BASE, SLIT("Num"))
-enumClass_RDR          = tcQual (pREL_BASE, SLIT("Enum"))
-monadClass_RDR         = tcQual (pREL_BASE, SLIT("Monad"))
-monadZeroClass_RDR     = tcQual (pREL_BASE, SLIT("MonadZero"))
-monadPlusClass_RDR     = tcQual (pREL_BASE, SLIT("MonadPlus"))
-functorClass_RDR       = tcQual (pREL_BASE, SLIT("Functor"))
-showClass_RDR          = tcQual (pREL_BASE, SLIT("Show"))
-realClass_RDR          = tcQual (pREL_NUM,  SLIT("Real"))
-integralClass_RDR      = tcQual (pREL_NUM,  SLIT("Integral"))
-fractionalClass_RDR    = tcQual (pREL_NUM,  SLIT("Fractional"))
-floatingClass_RDR      = tcQual (pREL_NUM,  SLIT("Floating"))
-realFracClass_RDR      = tcQual (pREL_NUM,  SLIT("RealFrac"))
-realFloatClass_RDR     = tcQual (pREL_NUM,  SLIT("RealFloat"))
-readClass_RDR          = tcQual (pREL_READ, SLIT("Read"))
-ixClass_RDR            = tcQual (iX,        SLIT("Ix"))
-ccallableClass_RDR     = tcQual (pREL_GHC,  SLIT("CCallable"))
-creturnableClass_RDR   = tcQual (pREL_GHC,  SLIT("CReturnable"))
-
-fromInt_RDR       = varQual (pREL_BASE, SLIT("fromInt"))
-fromInteger_RDR           = varQual (pREL_BASE, SLIT("fromInteger"))
-minus_RDR         = varQual (pREL_BASE, SLIT("-"))
-toEnum_RDR        = varQual (pREL_BASE, SLIT("toEnum"))
-fromEnum_RDR      = varQual (pREL_BASE, SLIT("fromEnum"))
-enumFrom_RDR      = varQual (pREL_BASE, SLIT("enumFrom"))
-enumFromTo_RDR    = varQual (pREL_BASE, SLIT("enumFromTo"))
-enumFromThen_RDR   = varQual (pREL_BASE, SLIT("enumFromThen"))
-enumFromThenTo_RDR = varQual (pREL_BASE, SLIT("enumFromThenTo"))
-
-thenM_RDR         = varQual (pREL_BASE,    SLIT(">>="))
-returnM_RDR       = varQual (pREL_BASE,    SLIT("return"))
-zeroM_RDR         = varQual (pREL_BASE,    SLIT("zero"))
-
-fromRational_RDR   = varQual (pREL_NUM,     SLIT("fromRational"))
-negate_RDR        = varQual (pREL_BASE, SLIT("negate"))
-eq_RDR            = varQual (pREL_BASE, SLIT("=="))
-ne_RDR            = varQual (pREL_BASE, SLIT("/="))
-le_RDR            = varQual (pREL_BASE, SLIT("<="))
-lt_RDR            = varQual (pREL_BASE, SLIT("<"))
-ge_RDR            = varQual (pREL_BASE, SLIT(">="))
-gt_RDR            = varQual (pREL_BASE, SLIT(">"))
-ltTag_RDR         = varQual (pREL_BASE,  SLIT("LT"))
-eqTag_RDR         = varQual (pREL_BASE,  SLIT("EQ"))
-gtTag_RDR         = varQual (pREL_BASE,  SLIT("GT"))
-max_RDR                   = varQual (pREL_BASE, SLIT("max"))
-min_RDR                   = varQual (pREL_BASE, SLIT("min"))
-compare_RDR       = varQual (pREL_BASE, SLIT("compare"))
-minBound_RDR      = varQual (pREL_BASE, SLIT("minBound"))
-maxBound_RDR      = varQual (pREL_BASE, SLIT("maxBound"))
-false_RDR         = varQual (pREL_BASE,  SLIT("False"))
-true_RDR          = varQual (pREL_BASE,  SLIT("True"))
-and_RDR                   = varQual (pREL_BASE,  SLIT("&&"))
-not_RDR                   = varQual (pREL_BASE,  SLIT("not"))
-compose_RDR       = varQual (pREL_BASE, SLIT("."))
-append_RDR        = varQual (pREL_BASE, SLIT("++"))
-map_RDR                   = varQual (pREL_BASE, SLIT("map"))
-concat_RDR        = varQual (mONAD,     SLIT("concat"))
-filter_RDR        = varQual (mONAD,     SLIT("filter"))
-zip_RDR                   = varQual (pREL_LIST, SLIT("zip"))
-
-showList___RDR     = varQual (pREL_BASE,  SLIT("showList__"))
-showsPrec_RDR     = varQual (pREL_BASE, SLIT("showsPrec"))
-showList_RDR      = varQual (pREL_BASE, SLIT("showList"))
-showSpace_RDR     = varQual (pREL_BASE,  SLIT("showSpace"))
-showString_RDR    = varQual (pREL_BASE, SLIT("showString"))
-showParen_RDR     = varQual (pREL_BASE, SLIT("showParen"))
-
-range_RDR         = varQual (iX,   SLIT("range"))
-index_RDR         = varQual (iX,   SLIT("index"))
-inRange_RDR       = varQual (iX,   SLIT("inRange"))
-
-readsPrec_RDR     = varQual (pREL_READ, SLIT("readsPrec"))
-readList_RDR      = varQual (pREL_READ, SLIT("readList"))
-readParen_RDR     = varQual (pREL_READ, SLIT("readParen"))
-lex_RDR                   = varQual (pREL_READ,  SLIT("lex"))
-readList___RDR     = varQual (pREL_READ,  SLIT("readList__"))
-
-plus_RDR          = varQual (pREL_BASE, SLIT("+"))
-times_RDR         = varQual (pREL_BASE, SLIT("*"))
-mkInt_RDR         = varQual (pREL_BASE, SLIT("I#"))
-
-error_RDR         = varQual (pREL_ERR, SLIT("error"))
-assert_RDR         = varQual (pREL_GHC, SLIT("assert"))
-assertErr_RDR      = varQual (pREL_ERR, SLIT("assertError"))
+prelude_primop op = nameRdrName (getName (mkPrimitiveId op))
+
+main_RDR               = varQual mAIN      SLIT("main")
+otherwiseId_RDR        = varQual pREL_BASE SLIT("otherwise")
+
+intTyCon_RDR           = nameRdrName (getName intTyCon)
+ioTyCon_RDR            = tcQual   pREL_IO_BASE SLIT("IO")
+ioDataCon_RDR                  = dataQual pREL_IO_BASE SLIT("IO")
+bindIO_RDR             = varQual  pREL_IO_BASE SLIT("bindIO")
+
+orderingTyCon_RDR      = tcQual   pREL_BASE SLIT("Ordering")
+rationalTyCon_RDR      = tcQual   pREL_NUM  SLIT("Rational")
+ratioTyCon_RDR         = tcQual   pREL_NUM  SLIT("Ratio")
+ratioDataCon_RDR       = dataQual pREL_NUM  SLIT(":%")
+
+byteArrayTyCon_RDR             = tcQual pREL_ARR  SLIT("ByteArray")
+mutableByteArrayTyCon_RDR      = tcQual pREL_ARR  SLIT("MutableByteArray")
+
+foreignObjTyCon_RDR    = tcQual  pREL_IO_BASE SLIT("ForeignObj")
+stablePtrTyCon_RDR     = tcQual  pREL_STABLE SLIT("StablePtr")
+deRefStablePtr_RDR      = varQual pREL_STABLE SLIT("deRefStablePtr")
+makeStablePtr_RDR       = varQual pREL_STABLE SLIT("makeStablePtr")
+
+eqClass_RDR            = clsQual pREL_BASE SLIT("Eq")
+ordClass_RDR           = clsQual pREL_BASE SLIT("Ord")
+boundedClass_RDR       = clsQual pREL_BASE SLIT("Bounded")
+numClass_RDR           = clsQual pREL_BASE SLIT("Num")
+enumClass_RDR          = clsQual pREL_BASE SLIT("Enum")
+monadClass_RDR         = clsQual pREL_BASE SLIT("Monad")
+monadPlusClass_RDR     = clsQual pREL_BASE SLIT("MonadPlus")
+functorClass_RDR       = clsQual pREL_BASE SLIT("Functor")
+showClass_RDR          = clsQual pREL_BASE SLIT("Show")
+realClass_RDR          = clsQual pREL_NUM  SLIT("Real")
+integralClass_RDR      = clsQual pREL_NUM  SLIT("Integral")
+fractionalClass_RDR    = clsQual pREL_NUM  SLIT("Fractional")
+floatingClass_RDR      = clsQual pREL_NUM  SLIT("Floating")
+realFracClass_RDR      = clsQual pREL_NUM  SLIT("RealFrac")
+realFloatClass_RDR     = clsQual pREL_NUM  SLIT("RealFloat")
+readClass_RDR          = clsQual pREL_READ SLIT("Read")
+ixClass_RDR            = clsQual iX        SLIT("Ix")
+ccallableClass_RDR     = clsQual pREL_GHC  SLIT("CCallable")
+creturnableClass_RDR   = clsQual pREL_GHC  SLIT("CReturnable")
+
+fromInt_RDR       = varQual pREL_BASE SLIT("fromInt")
+fromInteger_RDR           = varQual pREL_BASE SLIT("fromInteger")
+minus_RDR         = varQual pREL_BASE SLIT("-")
+succ_RDR          = varQual pREL_BASE SLIT("succ")
+pred_RDR          = varQual pREL_BASE SLIT("pred")
+toEnum_RDR        = varQual pREL_BASE SLIT("toEnum")
+fromEnum_RDR      = varQual pREL_BASE SLIT("fromEnum")
+enumFrom_RDR      = varQual pREL_BASE SLIT("enumFrom")
+enumFromTo_RDR    = varQual pREL_BASE SLIT("enumFromTo")
+enumFromThen_RDR   = varQual pREL_BASE SLIT("enumFromThen")
+enumFromThenTo_RDR = varQual pREL_BASE SLIT("enumFromThenTo")
+
+thenM_RDR         = varQual pREL_BASE SLIT(">>=")
+returnM_RDR       = varQual pREL_BASE SLIT("return")
+failM_RDR         = varQual pREL_BASE SLIT("fail")
+
+fromRational_RDR   = varQual pREL_NUM  SLIT("fromRational")
+negate_RDR        = varQual pREL_BASE SLIT("negate")
+eq_RDR            = varQual pREL_BASE SLIT("==")
+ne_RDR            = varQual pREL_BASE SLIT("/=")
+le_RDR            = varQual pREL_BASE SLIT("<=")
+lt_RDR            = varQual pREL_BASE SLIT("<")
+ge_RDR            = varQual pREL_BASE SLIT(">=")
+gt_RDR            = varQual pREL_BASE SLIT(">")
+ltTag_RDR         = dataQual pREL_BASE SLIT("LT")
+eqTag_RDR         = dataQual pREL_BASE SLIT("EQ")
+gtTag_RDR         = dataQual pREL_BASE SLIT("GT")
+max_RDR                   = varQual pREL_BASE SLIT("max")
+min_RDR                   = varQual pREL_BASE SLIT("min")
+compare_RDR       = varQual pREL_BASE SLIT("compare")
+minBound_RDR      = varQual pREL_BASE SLIT("minBound")
+maxBound_RDR      = varQual pREL_BASE SLIT("maxBound")
+false_RDR         = dataQual pREL_BASE SLIT("False")
+true_RDR          = dataQual pREL_BASE SLIT("True")
+and_RDR                   = varQual pREL_BASE SLIT("&&")
+not_RDR                   = varQual pREL_BASE SLIT("not")
+compose_RDR       = varQual pREL_BASE SLIT(".")
+append_RDR        = varQual pREL_BASE SLIT("++")
+map_RDR                   = varQual pREL_BASE SLIT("map")
+concat_RDR        = varQual mONAD     SLIT("concat")
+filter_RDR        = varQual mONAD     SLIT("filter")
+zip_RDR                   = varQual pREL_LIST SLIT("zip")
+
+showList___RDR     = varQual pREL_BASE  SLIT("showList__")
+showsPrec_RDR     = varQual pREL_BASE SLIT("showsPrec")
+showList_RDR      = varQual pREL_BASE SLIT("showList")
+showSpace_RDR     = varQual pREL_BASE SLIT("showSpace")
+showString_RDR    = varQual pREL_BASE SLIT("showString")
+showParen_RDR     = varQual pREL_BASE SLIT("showParen")
+
+range_RDR         = varQual iX   SLIT("range")
+index_RDR         = varQual iX   SLIT("index")
+inRange_RDR       = varQual iX   SLIT("inRange")
+
+readsPrec_RDR     = varQual pREL_READ SLIT("readsPrec")
+readList_RDR      = varQual pREL_READ SLIT("readList")
+readParen_RDR     = varQual pREL_READ SLIT("readParen")
+lex_RDR                   = varQual pREL_READ SLIT("lex")
+readList___RDR     = varQual pREL_READ SLIT("readList__")
+
+plus_RDR          = varQual pREL_BASE SLIT("+")
+times_RDR         = varQual pREL_BASE SLIT("*")
+mkInt_RDR         = dataQual pREL_BASE SLIT("I#")
+
+error_RDR         = varQual pREL_ERR SLIT("error")
+assert_RDR         = varQual pREL_GHC SLIT("assert")
+assertErr_RDR      = varQual pREL_ERR SLIT("assertError")
 
 eqH_Char_RDR   = prelude_primop CharEqOp
 ltH_Char_RDR   = prelude_primop CharLtOp
@@ -561,6 +571,17 @@ leH_RDR            = prelude_primop IntLeOp
 minusH_RDR     = prelude_primop IntSubOp
 \end{code}
 
+\begin{code}
+mkTupConRdrName :: Int -> RdrName 
+mkTupConRdrName arity = case mkTupNameStr arity of
+                         (mod, occ) -> dataQual mod occ
+
+mkUbxTupConRdrName :: Int -> RdrName
+mkUbxTupConRdrName arity = case mkUbxTupNameStr arity of
+                               (mod, occ) -> dataQual mod occ
+\end{code}
+
+
 %************************************************************************
 %*                                                                     *
 \subsection[Class-std-groups]{Standard groups of Prelude classes}
@@ -590,15 +611,20 @@ deriving_occ_info
     , (ordClassKey,    [intTyCon_RDR, compose_RDR, eqTag_RDR])
                                -- EQ (from Ordering) is needed to force in the constructors
                                -- as well as the type constructor.
-    , (enumClassKey,   [intTyCon_RDR, map_RDR])
+    , (enumClassKey,   [intTyCon_RDR, and_RDR, map_RDR, plus_RDR, showsPrec_RDR, append_RDR]) 
+                               -- The last two Enum deps are only used to produce better
+                               -- error msgs for derived toEnum methods.
     , (boundedClassKey,        [intTyCon_RDR])
     , (showClassKey,   [intTyCon_RDR, numClass_RDR, ordClass_RDR, compose_RDR, showString_RDR, 
                         showParen_RDR, showSpace_RDR, showList___RDR])
     , (readClassKey,   [intTyCon_RDR, numClass_RDR, ordClass_RDR, append_RDR, 
-                        lex_RDR, readParen_RDR, readList___RDR])
+                        lex_RDR, readParen_RDR, readList___RDR, thenM_RDR])
+                            -- returnM (and the rest of the Monad class decl) 
+                            -- will be forced in as result of depending
+                            -- on thenM.   -- SOF 1/99
     , (ixClassKey,     [intTyCon_RDR, numClass_RDR, and_RDR, map_RDR, enumFromTo_RDR, 
-                        returnM_RDR, zeroM_RDR])
-                            -- the last two are needed to force returnM, thenM and zeroM
+                        returnM_RDR, failM_RDR])
+                            -- the last two are needed to force returnM, thenM and failM
                             -- in before typechecking the list(monad) comprehension
                             -- generated for derived Ix instances (range method)
                             -- of single constructor types.  -- SOF 8/97
@@ -680,3 +706,18 @@ noDictClassKeys    -- These classes are used only for type annotations;
                        -- they are not implemented by dictionaries, ever.
   = cCallishClassKeys
 \end{code}
+
+
+%************************************************************************
+%*                                                                     *
+\subsection{Local helpers}
+%*                                                                     *
+%************************************************************************
+
+\begin{code}
+varQual  = mkPreludeQual varName
+dataQual = mkPreludeQual dataName
+tcQual   = mkPreludeQual tcName
+clsQual  = mkPreludeQual clsName
+\end{code}
+