Follow library changes
[ghc-hetmet.git] / compiler / prelude / PrelNames.lhs
index 9ff85fa..c324e95 100644 (file)
@@ -36,6 +36,13 @@ Nota Bene: all Names defined in here should come from the base package
 
 
 \begin{code}
+{-# OPTIONS -w #-}
+-- The above warning supression flag is a temporary kludge.
+-- While working on this module you are encouraged to remove it and fix
+-- any warnings in the module. See
+--     http://hackage.haskell.org/trac/ghc/wiki/Commentary/CodingStyle#Warnings
+-- for details
+
 module PrelNames (
        Unique, Uniquable(..), hasKey,  -- Re-exported for convenience
 
@@ -49,10 +56,9 @@ module PrelNames (
 
 #include "HsVersions.h"
 
-import PackageConfig
-import Module    ( Module, ModuleName, mkModule, mkModuleNameFS )
-import OccName   ( dataName, tcName, clsName, varName, mkOccNameFS,
-                   mkVarOccFS )
+import Module
+import OccName   ( dataName, tcName, clsName, varName, tvName, 
+                   mkOccNameFS, mkVarOccFS )
 import RdrName   ( RdrName, nameRdrName, mkOrig, rdrNameOcc, mkUnqual )
 import Unique    ( Unique, Uniquable(..), hasKey,
                    mkPreludeMiscIdUnique, mkPreludeDataConUnique,
@@ -61,7 +67,7 @@ import Unique   ( Unique, Uniquable(..), hasKey,
                  ) 
 import BasicTypes ( Boxity(..), Arity )
 import Name      ( Name, mkInternalName, mkExternalName )
-import SrcLoc     ( noSrcLoc )
+import SrcLoc
 import FastString
 \end{code}
 
@@ -75,14 +81,14 @@ import FastString
 This *local* name is used by the interactive stuff
 
 \begin{code}
-itName uniq = mkInternalName uniq (mkOccNameFS varName FSLIT("it")) noSrcLoc
+itName uniq = mkInternalName uniq (mkOccNameFS varName FSLIT("it")) noSrcSpan
 \end{code}
 
 \begin{code}
 -- mkUnboundName makes a place-holder Name; it shouldn't be looked at except possibly
 -- during compiler debugging.
 mkUnboundName :: RdrName -> Name
-mkUnboundName rdr_name = mkInternalName unboundKey (rdrNameOcc rdr_name) noSrcLoc
+mkUnboundName rdr_name = mkInternalName unboundKey (rdrNameOcc rdr_name) noSrcSpan
 
 isUnboundName :: Name -> Bool
 isUnboundName name = name `hasKey` unboundKey
@@ -109,9 +115,10 @@ basicKnownKeyNames
        runMainIOName,
        orderingTyConName,
        rationalTyConName,
+       stringTyConName,
        ratioDataConName,
        ratioTyConName,
-       integerTyConName, smallIntegerDataConName, largeIntegerDataConName,
+       integerTyConName, smallIntegerName,
 
        --  Classes.  *Must* include:
        --      classes that are grabbed by key (e.g., eqClassKey)
@@ -130,11 +137,15 @@ basicKnownKeyNames
        realFracClassName,              -- numeric
        realFloatClassName,             -- numeric
        dataClassName, 
+       isStringClassName,
 
        -- Numeric stuff
        negateName, minusName, 
        fromRationalName, fromIntegerName, 
        geName, eqName, 
+
+        -- String stuff
+        fromStringName,
        
        -- Enum stuff
        enumFromName, enumFromThenName, 
@@ -164,17 +175,20 @@ basicKnownKeyNames
        -- Stable pointers
        newStablePtrName,
 
+    -- GHC Extensions
+    groupWithName,
+
        -- Strings and lists
        unpackCStringName, unpackCStringAppendName,
        unpackCStringFoldrName, unpackCStringUtf8Name,
 
        -- List operations
-       concatName, filterName,
+       concatName, filterName, mapName,
        zipName, foldrName, buildName, augmentName, appendName,
 
         -- Parallel array operations
-       nullPName, lengthPName, replicatePName, mapPName,
-       filterPName, zipPName, crossPName, indexPName,
+       nullPName, lengthPName, replicatePName, singletonPName, mapPName,
+       filterPName, zipPName, crossMapPName, indexPName,
        toPName, bpermutePName, bpermuteDftPName, indexOfPName,
 
        -- FFI primitive types that are not wired-in.
@@ -183,9 +197,10 @@ basicKnownKeyNames
        wordTyConName, word8TyConName, word16TyConName, word32TyConName, word64TyConName,
 
        -- Others
-       otherwiseIdName, 
+       otherwiseIdName, inlineIdName,
        plusIntegerName, timesIntegerName,
        eqStringName, assertName, breakpointName, breakpointCondName,
+        breakpointAutoName,  opaqueTyConName,
         assertErrorName, runSTRepName,
        printName, fstName, sndName,
 
@@ -221,16 +236,20 @@ genericTyConNames = [crossTyConName, plusTyConName, genUnitTyConName]
 --MetaHaskell Extension Add a new module here
 \begin{code}
 pRELUDE                = mkBaseModule_ pRELUDE_NAME
-gHC_PRIM       = mkBaseModule FSLIT("GHC.Prim")   -- Primitive types and values
+gHC_PRIM       = mkPrimModule FSLIT("GHC.Prim")   -- Primitive types and values
+gHC_BOOL       = mkPrimModule FSLIT("GHC.Bool")
+gHC_GENERICS   = mkPrimModule FSLIT("GHC.Generics")
 gHC_BASE       = mkBaseModule FSLIT("GHC.Base")
 gHC_ENUM       = mkBaseModule FSLIT("GHC.Enum")
 gHC_SHOW       = mkBaseModule FSLIT("GHC.Show")
 gHC_READ       = mkBaseModule FSLIT("GHC.Read")
 gHC_NUM                = mkBaseModule FSLIT("GHC.Num")
+gHC_INTEGER    = mkIntegerModule FSLIT("GHC.Integer")
 gHC_LIST       = mkBaseModule FSLIT("GHC.List")
 gHC_PARR       = mkBaseModule FSLIT("GHC.PArr")
 dATA_TUP       = mkBaseModule FSLIT("Data.Tuple")
 dATA_EITHER    = mkBaseModule FSLIT("Data.Either")
+dATA_STRING    = mkBaseModule FSLIT("Data.String")
 gHC_PACK       = mkBaseModule FSLIT("GHC.Pack")
 gHC_CONC       = mkBaseModule FSLIT("GHC.Conc")
 gHC_IO_BASE    = mkBaseModule FSLIT("GHC.IOBase")
@@ -249,14 +268,15 @@ tYPEABLE  = mkBaseModule FSLIT("Data.Typeable")
 gENERICS       = mkBaseModule FSLIT("Data.Generics.Basics")
 dOTNET         = mkBaseModule FSLIT("GHC.Dotnet")
 rEAD_PREC      = mkBaseModule FSLIT("Text.ParserCombinators.ReadPrec")
-lEX            = mkBaseModule FSLIT("Text.Read.Lex")
+lEX                = mkBaseModule FSLIT("Text.Read.Lex")
 gHC_INT                = mkBaseModule FSLIT("GHC.Int")
 gHC_WORD       = mkBaseModule FSLIT("GHC.Word")
 mONAD          = mkBaseModule FSLIT("Control.Monad")
 mONAD_FIX      = mkBaseModule FSLIT("Control.Monad.Fix")
 aRROW          = mkBaseModule FSLIT("Control.Arrow")
+gHC_DESUGAR = mkBaseModule FSLIT("GHC.Desugar")
 rANDOM         = mkBaseModule FSLIT("System.Random")
-gLA_EXTS       = mkBaseModule FSLIT("GHC.Exts")
+gHC_EXTS       = mkBaseModule FSLIT("GHC.Exts")
 
 mAIN           = mkMainModule_ mAIN_NAME
 rOOT_MAIN      = mkMainModule FSLIT(":Main") -- Root module for initialisation 
@@ -271,6 +291,12 @@ thFAKE         = mkMainModule FSLIT(":THFake")
 pRELUDE_NAME   = mkModuleNameFS FSLIT("Prelude")
 mAIN_NAME      = mkModuleNameFS FSLIT("Main")
 
+mkPrimModule :: FastString -> Module
+mkPrimModule m = mkModule primPackageId (mkModuleNameFS m)
+
+mkIntegerModule :: FastString -> Module
+mkIntegerModule m = mkModule integerPackageId (mkModuleNameFS m)
+
 mkBaseModule :: FastString -> Module
 mkBaseModule m = mkModule basePackageId (mkModuleNameFS m)
 
@@ -305,14 +331,19 @@ mkTupleModule Unboxed _ = gHC_PRIM
 %************************************************************************
 
 \begin{code}
-main_RDR_Unqual        = mkUnqual varName FSLIT("main")
+main_RDR_Unqual        = mkUnqual varName FSLIT("main")
        -- We definitely don't want an Orig RdrName, because
        -- main might, in principle, be imported into module Main
 
+forall_tv_RDR, dot_tv_RDR :: RdrName
+forall_tv_RDR = mkUnqual tvName FSLIT("forall")
+dot_tv_RDR    = mkUnqual tvName FSLIT(".")
+
 eq_RDR                         = nameRdrName eqName
 ge_RDR                         = nameRdrName geName
 ne_RDR                         = varQual_RDR  gHC_BASE FSLIT("/=")
 le_RDR                         = varQual_RDR  gHC_BASE FSLIT("<=") 
+lt_RDR                         = varQual_RDR  gHC_BASE FSLIT("<") 
 gt_RDR                         = varQual_RDR  gHC_BASE FSLIT(">")  
 compare_RDR            = varQual_RDR  gHC_BASE FSLIT("compare") 
 ltTag_RDR              = dataQual_RDR gHC_BASE FSLIT("LT") 
@@ -370,6 +401,8 @@ minus_RDR           = nameRdrName minusName
 times_RDR              = varQual_RDR  gHC_NUM FSLIT("*")
 plus_RDR                = varQual_RDR gHC_NUM FSLIT("+")
 
+fromString_RDR         = nameRdrName fromStringName
+
 compose_RDR            = varQual_RDR gHC_BASE FSLIT(".")
 
 not_RDR                = varQual_RDR gHC_BASE FSLIT("not")
@@ -415,10 +448,10 @@ mkTyConRep_RDR = varQual_RDR tYPEABLE FSLIT("mkTyCon")
 
 undefined_RDR = varQual_RDR gHC_ERR FSLIT("undefined")
 
-crossDataCon_RDR   = dataQual_RDR gHC_BASE FSLIT(":*:")
-inlDataCon_RDR     = dataQual_RDR gHC_BASE FSLIT("Inl")
-inrDataCon_RDR     = dataQual_RDR gHC_BASE FSLIT("Inr")
-genUnitDataCon_RDR = dataQual_RDR gHC_BASE FSLIT("Unit")
+crossDataCon_RDR   = dataQual_RDR gHC_GENERICS FSLIT(":*:")
+inlDataCon_RDR     = dataQual_RDR gHC_GENERICS FSLIT("Inl")
+inrDataCon_RDR     = dataQual_RDR gHC_GENERICS FSLIT("Inr")
+genUnitDataCon_RDR = dataQual_RDR gHC_GENERICS FSLIT("Unit")
 
 ----------------------
 varQual_RDR  mod str = mkOrig mod (mkOccNameFS varName str)
@@ -451,9 +484,9 @@ leftDataConName   = conName dATA_EITHER FSLIT("Left")   leftDataConKey
 rightDataConName  = conName dATA_EITHER FSLIT("Right")  rightDataConKey
 
 -- Generics
-crossTyConName     = tcQual   gHC_BASE FSLIT(":*:") crossTyConKey
-plusTyConName      = tcQual   gHC_BASE FSLIT(":+:") plusTyConKey
-genUnitTyConName   = tcQual   gHC_BASE FSLIT("Unit") genUnitTyConKey
+crossTyConName     = tcQual   gHC_GENERICS FSLIT(":*:") crossTyConKey
+plusTyConName      = tcQual   gHC_GENERICS FSLIT(":+:") plusTyConKey
+genUnitTyConName   = tcQual   gHC_GENERICS FSLIT("Unit") genUnitTyConKey
 
 -- Base strings Strings
 unpackCStringName       = varQual gHC_BASE FSLIT("unpackCString#") unpackCStringIdKey
@@ -461,6 +494,7 @@ unpackCStringAppendName = varQual gHC_BASE FSLIT("unpackAppendCString#") unpackC
 unpackCStringFoldrName  = varQual gHC_BASE FSLIT("unpackFoldrCString#") unpackCStringFoldrIdKey
 unpackCStringUtf8Name   = varQual gHC_BASE FSLIT("unpackCStringUtf8#") unpackCStringUtf8IdKey
 eqStringName           = varQual gHC_BASE FSLIT("eqString")  eqStringIdKey
+stringTyConName         = tcQual  gHC_BASE FSLIT("String") stringTyConKey
 
 -- The 'inline' function
 inlineIdName           = varQual gHC_BASE FSLIT("inline") inlineIdKey
@@ -479,27 +513,40 @@ bindMName    = methName gHC_BASE FSLIT(">>=")    bindMClassOpKey
 returnMName       = methName gHC_BASE FSLIT("return") returnMClassOpKey
 failMName         = methName gHC_BASE FSLIT("fail")   failMClassOpKey
 
+-- Functions for GHC extensions
+groupWithName  = varQual gHC_EXTS FSLIT("groupWith") groupWithIdKey
+
 -- Random PrelBase functions
+fromStringName = methName dATA_STRING FSLIT("fromString") fromStringClassOpKey
 otherwiseIdName   = varQual gHC_BASE FSLIT("otherwise")  otherwiseIdKey
 foldrName        = varQual gHC_BASE FSLIT("foldr")      foldrIdKey
 buildName        = varQual gHC_BASE FSLIT("build")      buildIdKey
 augmentName      = varQual gHC_BASE FSLIT("augment")    augmentIdKey
+mapName       = varQual gHC_BASE FSLIT("map")        mapIdKey
 appendName       = varQual gHC_BASE FSLIT("++")         appendIdKey
-andName                  = varQual gHC_BASE FSLIT("&&")          andIdKey
-orName           = varQual gHC_BASE FSLIT("||")          orIdKey
+andName                  = varQual gHC_BASE FSLIT("&&")         andIdKey
+orName           = varQual gHC_BASE FSLIT("||")         orIdKey
 assertName        = varQual gHC_BASE FSLIT("assert")     assertIdKey
 breakpointName    = varQual gHC_BASE FSLIT("breakpoint") breakpointIdKey
 breakpointCondName= varQual gHC_BASE FSLIT("breakpointCond") breakpointCondIdKey
+breakpointAutoName= varQual gHC_BASE FSLIT("breakpointAuto") breakpointAutoIdKey
+opaqueTyConName   = tcQual  gHC_BASE FSLIT("Opaque")   opaqueTyConKey
+
 breakpointJumpName
     = mkInternalName
         breakpointJumpIdKey
         (mkOccNameFS varName FSLIT("breakpointJump"))
-        noSrcLoc
+        noSrcSpan
 breakpointCondJumpName
     = mkInternalName
         breakpointCondJumpIdKey
         (mkOccNameFS varName FSLIT("breakpointCondJump"))
-        noSrcLoc
+        noSrcSpan
+breakpointAutoJumpName
+    = mkInternalName
+        breakpointAutoJumpIdKey
+        (mkOccNameFS varName FSLIT("breakpointAutoJump"))
+        noSrcSpan
 
 -- PrelTup
 fstName                  = varQual dATA_TUP FSLIT("fst") fstIdKey
@@ -510,11 +557,10 @@ numClassName        = clsQual  gHC_NUM FSLIT("Num") numClassKey
 fromIntegerName   = methName gHC_NUM FSLIT("fromInteger") fromIntegerClassOpKey
 minusName        = methName gHC_NUM FSLIT("-") minusClassOpKey
 negateName       = methName gHC_NUM FSLIT("negate") negateClassOpKey
-plusIntegerName   = varQual  gHC_NUM FSLIT("plusInteger") plusIntegerIdKey
-timesIntegerName  = varQual  gHC_NUM FSLIT("timesInteger") timesIntegerIdKey
-integerTyConName  = tcQual   gHC_NUM FSLIT("Integer") integerTyConKey
-smallIntegerDataConName = conName gHC_NUM FSLIT("S#") smallIntegerDataConKey
-largeIntegerDataConName = conName gHC_NUM FSLIT("J#") largeIntegerDataConKey
+plusIntegerName   = varQual  gHC_INTEGER FSLIT("plusInteger") plusIntegerIdKey
+timesIntegerName  = varQual  gHC_INTEGER FSLIT("timesInteger") timesIntegerIdKey
+integerTyConName  = tcQual   gHC_INTEGER FSLIT("Integer") integerTyConKey
+smallIntegerName = varQual gHC_INTEGER FSLIT("smallInteger") smallIntegerIdKey
 
 -- PrelReal types and classes
 rationalTyConName   = tcQual  gHC_REAL FSLIT("Rational") rationalTyConKey
@@ -577,11 +623,12 @@ enumFromToPName      = varQual gHC_PARR FSLIT("enumFromToP") enumFromToPIdKey
 enumFromThenToPName= varQual gHC_PARR FSLIT("enumFromThenToP") enumFromThenToPIdKey
 nullPName        = varQual gHC_PARR FSLIT("nullP")              nullPIdKey
 lengthPName      = varQual gHC_PARR FSLIT("lengthP")            lengthPIdKey
+singletonPName    = varQual gHC_PARR FSLIT("singletonP")         singletonPIdKey
 replicatePName   = varQual gHC_PARR FSLIT("replicateP")         replicatePIdKey
 mapPName         = varQual gHC_PARR FSLIT("mapP")               mapPIdKey
 filterPName      = varQual gHC_PARR FSLIT("filterP")            filterPIdKey
 zipPName         = varQual gHC_PARR FSLIT("zipP")               zipPIdKey
-crossPName       = varQual gHC_PARR FSLIT("crossP")             crossPIdKey
+crossMapPName    = varQual gHC_PARR FSLIT("crossMapP")          crossMapPIdKey
 indexPName       = varQual gHC_PARR FSLIT("!:")                 indexPIdKey
 toPName                  = varQual gHC_PARR FSLIT("toP")                toPIdKey
 bpermutePName     = varQual gHC_PARR FSLIT("bpermuteP")    bpermutePIdKey
@@ -630,7 +677,7 @@ mfixName       = methName mONAD_FIX FSLIT("mfix") mfixIdKey
 
 -- Arrow notation
 arrAName          = varQual aRROW FSLIT("arr")   arrAIdKey
-composeAName      = varQual aRROW FSLIT(">>>")   composeAIdKey
+composeAName      = varQual gHC_DESUGAR FSLIT(">>>") composeAIdKey
 firstAName        = varQual aRROW FSLIT("first") firstAIdKey
 appAName          = varQual aRROW FSLIT("app")   appAIdKey
 choiceAName       = varQual aRROW FSLIT("|||")   choiceAIdKey
@@ -640,6 +687,7 @@ loopAName      = varQual aRROW FSLIT("loop")  loopAIdKey
 monadPlusClassName  = clsQual mONAD FSLIT("MonadPlus")  monadPlusClassKey
 randomClassName     = clsQual rANDOM FSLIT("Random")    randomClassKey
 randomGenClassName  = clsQual rANDOM FSLIT("RandomGen") randomGenClassKey
+isStringClassName   = clsQual dATA_STRING FSLIT("IsString") isStringClassKey
 
 -- dotnet interop
 objectTyConName            = tcQual   dOTNET FSLIT("Object") objectTyConKey
@@ -666,15 +714,15 @@ tcQual   = mk_known_key_name tcName
 clsQual  = mk_known_key_name clsName
 
 mk_known_key_name space mod str uniq 
-  = mkExternalName uniq mod (mkOccNameFS space str) noSrcLoc
+  = mkExternalName uniq mod (mkOccNameFS space str) noSrcSpan
 
 conName :: Module -> FastString -> Unique -> Name
 conName mod occ uniq
-  = mkExternalName uniq mod (mkOccNameFS dataName occ) noSrcLoc
+  = mkExternalName uniq mod (mkOccNameFS dataName occ) noSrcSpan
 
 methName :: Module -> FastString -> Unique -> Name
 methName mod occ uniq
-  = mkExternalName uniq mod (mkVarOccFS occ) noSrcLoc
+  = mkExternalName uniq mod (mkVarOccFS occ) noSrcSpan
 \end{code}
 
 %************************************************************************
@@ -717,6 +765,8 @@ monadFixClassKey    = mkPreludeClassUnique 28
 monadPlusClassKey      = mkPreludeClassUnique 30
 randomClassKey         = mkPreludeClassUnique 31
 randomGenClassKey      = mkPreludeClassUnique 32
+
+isStringClassKey       = mkPreludeClassUnique 33
 \end{code}
 
 %************************************************************************
@@ -819,6 +869,13 @@ rightCoercionTyConKey                   = mkPreludeTyConUnique 96
 instCoercionTyConKey                    = mkPreludeTyConUnique 97
 unsafeCoercionTyConKey                  = mkPreludeTyConUnique 98
 
+unknownTyConKey                                = mkPreludeTyConUnique 99
+unknown1TyConKey                       = mkPreludeTyConUnique 130
+unknown2TyConKey                       = mkPreludeTyConUnique 131
+unknown3TyConKey                       = mkPreludeTyConUnique 132
+opaqueTyConKey                          = mkPreludeTyConUnique 133
+
+stringTyConKey                         = mkPreludeTyConUnique 134
 
 ---------------- Template Haskell -------------------
 --     USES TyConUniques 100-129
@@ -840,8 +897,6 @@ doubleDataConKey                    = mkPreludeDataConUnique  3
 falseDataConKey                                = mkPreludeDataConUnique  4
 floatDataConKey                                = mkPreludeDataConUnique  5
 intDataConKey                          = mkPreludeDataConUnique  6
-smallIntegerDataConKey                 = mkPreludeDataConUnique  7
-largeIntegerDataConKey                 = mkPreludeDataConUnique  8
 nilDataConKey                          = mkPreludeDataConUnique 11
 ratioDataConKey                                = mkPreludeDataConUnique 12
 stableNameDataConKey                   = mkPreludeDataConUnique 14
@@ -908,6 +963,7 @@ bindIOIdKey               = mkPreludeMiscIdUnique 36
 returnIOIdKey                = mkPreludeMiscIdUnique 37
 deRefStablePtrIdKey          = mkPreludeMiscIdUnique 38
 newStablePtrIdKey            = mkPreludeMiscIdUnique 39
+smallIntegerIdKey                      = mkPreludeMiscIdUnique  40
 plusIntegerIdKey             = mkPreludeMiscIdUnique 41
 timesIntegerIdKey            = mkPreludeMiscIdUnique 42
 printIdKey                   = mkPreludeMiscIdUnique 43
@@ -931,19 +987,25 @@ assertErrorIdKey        = mkPreludeMiscIdUnique 61
 
 breakpointIdKey               = mkPreludeMiscIdUnique 62
 breakpointCondIdKey           = mkPreludeMiscIdUnique 63
-breakpointJumpIdKey           = mkPreludeMiscIdUnique 64
-breakpointCondJumpIdKey       = mkPreludeMiscIdUnique 65
+breakpointAutoIdKey           = mkPreludeMiscIdUnique 64
+breakpointJumpIdKey           = mkPreludeMiscIdUnique 65
+breakpointCondJumpIdKey       = mkPreludeMiscIdUnique 66
+breakpointAutoJumpIdKey       = mkPreludeMiscIdUnique 67
+
+inlineIdKey                  = mkPreludeMiscIdUnique 68
 
-inlineIdKey                  = mkPreludeMiscIdUnique 66
+mapIdKey                     = mkPreludeMiscIdUnique 69
+groupWithIdKey        = mkPreludeMiscIdUnique 70
 
 -- Parallel array functions
+singletonPIdKey               = mkPreludeMiscIdUnique 79
 nullPIdKey                   = mkPreludeMiscIdUnique 80
 lengthPIdKey                 = mkPreludeMiscIdUnique 81
 replicatePIdKey                      = mkPreludeMiscIdUnique 82
 mapPIdKey                    = mkPreludeMiscIdUnique 83
 filterPIdKey                 = mkPreludeMiscIdUnique 84
 zipPIdKey                    = mkPreludeMiscIdUnique 85
-crossPIdKey                  = mkPreludeMiscIdUnique 86
+crossMapPIdKey               = mkPreludeMiscIdUnique 86
 indexPIdKey                  = mkPreludeMiscIdUnique 87
 toPIdKey                     = mkPreludeMiscIdUnique 88
 enumFromToPIdKey              = mkPreludeMiscIdUnique 89
@@ -995,6 +1057,8 @@ appAIdKey  = mkPreludeMiscIdUnique 122
 choiceAIdKey   = mkPreludeMiscIdUnique 123 --  |||
 loopAIdKey     = mkPreludeMiscIdUnique 124
 
+fromStringClassOpKey         = mkPreludeMiscIdUnique 125
+
 ---------------- Template Haskell -------------------
 --     USES IdUniques 200-399
 -----------------------------------------------------
@@ -1054,7 +1118,9 @@ needsDataDeclCtxtClassKeys = -- see comments in TcDeriv
 standardClassKeys = derivableClassKeys ++ numericClassKeys
                  ++ [randomClassKey, randomGenClassKey,
                      functorClassKey, 
-                     monadClassKey, monadPlusClassKey]
+                     monadClassKey, monadPlusClassKey,
+                     isStringClassKey
+                    ]
 \end{code}
 
 @derivableClassKeys@ is also used in checking \tr{deriving} constructs