Move error-ids to MkCore (from PrelRules)
[ghc-hetmet.git] / compiler / prelude / TysPrim.lhs
index dfdb2a5..ac3a528 100644 (file)
@@ -1,20 +1,18 @@
 %
 % (c) The AQUA Project, Glasgow University, 1994-1998
 %
 %
 % (c) The AQUA Project, Glasgow University, 1994-1998
 %
+
+     
 \section[TysPrim]{Wired-in knowledge about primitive types}
 
 \begin{code}
 \section[TysPrim]{Wired-in knowledge about primitive types}
 
 \begin{code}
-{-# OPTIONS_GHC -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/WorkingConventions#Warnings
--- for details
-
+-- | This module defines TyCons that can't be expressed in Haskell. 
+--   They are all, therefore, wired-in TyCons.  C.f module TysWiredIn
 module TysPrim(
        alphaTyVars, betaTyVars, alphaTyVar, betaTyVar, gammaTyVar, deltaTyVar,
        alphaTy, betaTy, gammaTy, deltaTy,
        openAlphaTy, openBetaTy, openAlphaTyVar, openBetaTyVar, openAlphaTyVars,
 module TysPrim(
        alphaTyVars, betaTyVars, alphaTyVar, betaTyVar, gammaTyVar, deltaTyVar,
        alphaTy, betaTy, gammaTy, deltaTy,
        openAlphaTy, openBetaTy, openAlphaTyVar, openBetaTyVar, openAlphaTyVars,
+        argAlphaTy, argAlphaTyVar, argBetaTy, argBetaTyVar,
 
        primTyCons,
 
 
        primTyCons,
 
@@ -48,29 +46,26 @@ module TysPrim(
        int64PrimTyCon,         int64PrimTy,
        word64PrimTyCon,        word64PrimTy,
 
        int64PrimTyCon,         int64PrimTy,
        word64PrimTyCon,        word64PrimTy,
 
-       anyPrimTyCon, anyPrimTy, anyPrimTyCon1, mkAnyPrimTyCon
+       -- * Any
+       anyTyCon, anyTyConOfKind, anyTypeOfKind
   ) where
 
 #include "HsVersions.h"
 
 import Var             ( TyVar, mkTyVar )
 import Name            ( Name, BuiltInSyntax(..), mkInternalName, mkWiredInName )
   ) where
 
 #include "HsVersions.h"
 
 import Var             ( TyVar, mkTyVar )
 import Name            ( Name, BuiltInSyntax(..), mkInternalName, mkWiredInName )
-import OccName         ( mkOccNameFS, tcName, mkTyVarOcc )
-import TyCon           ( TyCon, mkPrimTyCon, mkLiftedPrimTyCon,
-                         PrimRep(..) )
-import Type            ( mkTyConApp, mkTyConTy, mkTyVarTys, mkTyVarTy,
-                         unliftedTypeKind, 
-                         liftedTypeKind, openTypeKind, 
-                         Kind, mkArrowKinds, mkArrowKind,
-                         TyThing(..)
-                       )
+import OccName         ( mkTcOcc )
+import OccName         ( mkTyVarOccFS, mkTcOccFS )
+import TyCon           ( TyCon, mkPrimTyCon, mkLiftedPrimTyCon, mkAnyTyCon )
+import Type
+import Coercion
 import SrcLoc
 import SrcLoc
-import Unique          ( mkAlphaTyVarUnique, pprUnique )
+import Unique          ( mkAlphaTyVarUnique )
 import PrelNames
 import PrelNames
-import FastString      ( FastString, mkFastString )
+import FastString
 import Outputable
 
 import Outputable
 
-import Char            ( ord, chr )
+import Data.Char
 \end{code}
 
 %************************************************************************
 \end{code}
 
 %************************************************************************
@@ -106,42 +101,41 @@ primTyCons
     , wordPrimTyCon
     , word32PrimTyCon
     , word64PrimTyCon
     , wordPrimTyCon
     , word32PrimTyCon
     , word64PrimTyCon
-    , anyPrimTyCon, anyPrimTyCon1
+    , anyTyCon
     ]
 
 mkPrimTc :: FastString -> Unique -> TyCon -> Name
     ]
 
 mkPrimTc :: FastString -> Unique -> TyCon -> Name
-mkPrimTc fs uniq tycon
-  = mkWiredInName gHC_PRIM (mkOccNameFS tcName fs) 
-                 uniq
+mkPrimTc fs unique tycon
+  = mkWiredInName gHC_PRIM (mkTcOccFS fs) 
+                 unique
                  (ATyCon tycon)        -- Relevant TyCon
                  UserSyntax            -- None are built-in syntax
 
                  (ATyCon tycon)        -- Relevant TyCon
                  UserSyntax            -- None are built-in syntax
 
-charPrimTyConName            = mkPrimTc FSLIT("Char#") charPrimTyConKey charPrimTyCon
-intPrimTyConName             = mkPrimTc FSLIT("Int#") intPrimTyConKey  intPrimTyCon
-int32PrimTyConName           = mkPrimTc FSLIT("Int32#") int32PrimTyConKey int32PrimTyCon
-int64PrimTyConName           = mkPrimTc FSLIT("Int64#") int64PrimTyConKey int64PrimTyCon
-wordPrimTyConName            = mkPrimTc FSLIT("Word#") wordPrimTyConKey wordPrimTyCon
-word32PrimTyConName          = mkPrimTc FSLIT("Word32#") word32PrimTyConKey word32PrimTyCon
-word64PrimTyConName          = mkPrimTc FSLIT("Word64#") word64PrimTyConKey word64PrimTyCon
-addrPrimTyConName            = mkPrimTc FSLIT("Addr#") addrPrimTyConKey addrPrimTyCon
-floatPrimTyConName           = mkPrimTc FSLIT("Float#") floatPrimTyConKey floatPrimTyCon
-doublePrimTyConName          = mkPrimTc FSLIT("Double#") doublePrimTyConKey doublePrimTyCon
-statePrimTyConName           = mkPrimTc FSLIT("State#") statePrimTyConKey statePrimTyCon
-realWorldTyConName           = mkPrimTc FSLIT("RealWorld") realWorldTyConKey realWorldTyCon
-arrayPrimTyConName           = mkPrimTc FSLIT("Array#") arrayPrimTyConKey arrayPrimTyCon
-byteArrayPrimTyConName       = mkPrimTc FSLIT("ByteArray#") byteArrayPrimTyConKey byteArrayPrimTyCon
-mutableArrayPrimTyConName     = mkPrimTc FSLIT("MutableArray#") mutableArrayPrimTyConKey mutableArrayPrimTyCon
-mutableByteArrayPrimTyConName = mkPrimTc FSLIT("MutableByteArray#") mutableByteArrayPrimTyConKey mutableByteArrayPrimTyCon
-mutVarPrimTyConName          = mkPrimTc FSLIT("MutVar#") mutVarPrimTyConKey mutVarPrimTyCon
-mVarPrimTyConName            = mkPrimTc FSLIT("MVar#") mVarPrimTyConKey mVarPrimTyCon
-tVarPrimTyConName            = mkPrimTc FSLIT("TVar#") tVarPrimTyConKey tVarPrimTyCon
-stablePtrPrimTyConName        = mkPrimTc FSLIT("StablePtr#") stablePtrPrimTyConKey stablePtrPrimTyCon
-stableNamePrimTyConName       = mkPrimTc FSLIT("StableName#") stableNamePrimTyConKey stableNamePrimTyCon
-bcoPrimTyConName             = mkPrimTc FSLIT("BCO#") bcoPrimTyConKey bcoPrimTyCon
-weakPrimTyConName            = mkPrimTc FSLIT("Weak#") weakPrimTyConKey weakPrimTyCon
-threadIdPrimTyConName                = mkPrimTc FSLIT("ThreadId#") threadIdPrimTyConKey threadIdPrimTyCon
-anyPrimTyConName             = mkPrimTc FSLIT("Any") anyPrimTyConKey anyPrimTyCon
-anyPrimTyCon1Name            = mkPrimTc FSLIT("Any1") anyPrimTyCon1Key anyPrimTyCon
+charPrimTyConName, intPrimTyConName, int32PrimTyConName, int64PrimTyConName, wordPrimTyConName, word32PrimTyConName, word64PrimTyConName, addrPrimTyConName, floatPrimTyConName, doublePrimTyConName, statePrimTyConName, realWorldTyConName, arrayPrimTyConName, byteArrayPrimTyConName, mutableArrayPrimTyConName, mutableByteArrayPrimTyConName, mutVarPrimTyConName, mVarPrimTyConName, tVarPrimTyConName, stablePtrPrimTyConName, stableNamePrimTyConName, bcoPrimTyConName, weakPrimTyConName, threadIdPrimTyConName :: Name
+charPrimTyConName            = mkPrimTc (fsLit "Char#") charPrimTyConKey charPrimTyCon
+intPrimTyConName             = mkPrimTc (fsLit "Int#") intPrimTyConKey  intPrimTyCon
+int32PrimTyConName           = mkPrimTc (fsLit "Int32#") int32PrimTyConKey int32PrimTyCon
+int64PrimTyConName           = mkPrimTc (fsLit "Int64#") int64PrimTyConKey int64PrimTyCon
+wordPrimTyConName            = mkPrimTc (fsLit "Word#") wordPrimTyConKey wordPrimTyCon
+word32PrimTyConName          = mkPrimTc (fsLit "Word32#") word32PrimTyConKey word32PrimTyCon
+word64PrimTyConName          = mkPrimTc (fsLit "Word64#") word64PrimTyConKey word64PrimTyCon
+addrPrimTyConName            = mkPrimTc (fsLit "Addr#") addrPrimTyConKey addrPrimTyCon
+floatPrimTyConName           = mkPrimTc (fsLit "Float#") floatPrimTyConKey floatPrimTyCon
+doublePrimTyConName          = mkPrimTc (fsLit "Double#") doublePrimTyConKey doublePrimTyCon
+statePrimTyConName           = mkPrimTc (fsLit "State#") statePrimTyConKey statePrimTyCon
+realWorldTyConName           = mkPrimTc (fsLit "RealWorld") realWorldTyConKey realWorldTyCon
+arrayPrimTyConName           = mkPrimTc (fsLit "Array#") arrayPrimTyConKey arrayPrimTyCon
+byteArrayPrimTyConName       = mkPrimTc (fsLit "ByteArray#") byteArrayPrimTyConKey byteArrayPrimTyCon
+mutableArrayPrimTyConName     = mkPrimTc (fsLit "MutableArray#") mutableArrayPrimTyConKey mutableArrayPrimTyCon
+mutableByteArrayPrimTyConName = mkPrimTc (fsLit "MutableByteArray#") mutableByteArrayPrimTyConKey mutableByteArrayPrimTyCon
+mutVarPrimTyConName          = mkPrimTc (fsLit "MutVar#") mutVarPrimTyConKey mutVarPrimTyCon
+mVarPrimTyConName            = mkPrimTc (fsLit "MVar#") mVarPrimTyConKey mVarPrimTyCon
+tVarPrimTyConName            = mkPrimTc (fsLit "TVar#") tVarPrimTyConKey tVarPrimTyCon
+stablePtrPrimTyConName        = mkPrimTc (fsLit "StablePtr#") stablePtrPrimTyConKey stablePtrPrimTyCon
+stableNamePrimTyConName       = mkPrimTc (fsLit "StableName#") stableNamePrimTyConKey stableNamePrimTyCon
+bcoPrimTyConName             = mkPrimTc (fsLit "BCO#") bcoPrimTyConKey bcoPrimTyCon
+weakPrimTyConName            = mkPrimTc (fsLit "Weak#") weakPrimTyConKey weakPrimTyCon
+threadIdPrimTyConName                = mkPrimTc (fsLit "ThreadId#") threadIdPrimTyConKey threadIdPrimTyCon
 \end{code}
 
 %************************************************************************
 \end{code}
 
 %************************************************************************
@@ -156,7 +150,7 @@ alphaTyVars is a list of type variables for use in templates:
 \begin{code}
 tyVarList :: Kind -> [TyVar]
 tyVarList kind = [ mkTyVar (mkInternalName (mkAlphaTyVarUnique u) 
 \begin{code}
 tyVarList :: Kind -> [TyVar]
 tyVarList kind = [ mkTyVar (mkInternalName (mkAlphaTyVarUnique u) 
-                               (mkTyVarOcc (mkFastString name))
+                               (mkTyVarOccFS (mkFastString name))
                                noSrcSpan) kind
                 | u <- [2..],
                   let name | c <= 'z'  = [c]
                                noSrcSpan) kind
                 | u <- [2..],
                   let name | c <= 'z'  = [c]
@@ -167,22 +161,139 @@ tyVarList kind = [ mkTyVar (mkInternalName (mkAlphaTyVarUnique u)
 alphaTyVars :: [TyVar]
 alphaTyVars = tyVarList liftedTypeKind
 
 alphaTyVars :: [TyVar]
 alphaTyVars = tyVarList liftedTypeKind
 
+betaTyVars :: [TyVar]
 betaTyVars = tail alphaTyVars
 
 betaTyVars = tail alphaTyVars
 
-alphaTyVar, betaTyVar, gammaTyVar :: TyVar
+alphaTyVar, betaTyVar, gammaTyVar, deltaTyVar :: TyVar
 (alphaTyVar:betaTyVar:gammaTyVar:deltaTyVar:_) = alphaTyVars
 
 (alphaTyVar:betaTyVar:gammaTyVar:deltaTyVar:_) = alphaTyVars
 
+alphaTys :: [Type]
 alphaTys = mkTyVarTys alphaTyVars
 alphaTys = mkTyVarTys alphaTyVars
+alphaTy, betaTy, gammaTy, deltaTy :: Type
 (alphaTy:betaTy:gammaTy:deltaTy:_) = alphaTys
 
        -- openAlphaTyVar is prepared to be instantiated
        -- to a lifted or unlifted type variable.  It's used for the 
        -- result type for "error", so that we can have (error Int# "Help")
 openAlphaTyVars :: [TyVar]
 (alphaTy:betaTy:gammaTy:deltaTy:_) = alphaTys
 
        -- openAlphaTyVar is prepared to be instantiated
        -- to a lifted or unlifted type variable.  It's used for the 
        -- result type for "error", so that we can have (error Int# "Help")
 openAlphaTyVars :: [TyVar]
+openAlphaTyVar, openBetaTyVar :: TyVar
 openAlphaTyVars@(openAlphaTyVar:openBetaTyVar:_) = tyVarList openTypeKind
 
 openAlphaTyVars@(openAlphaTyVar:openBetaTyVar:_) = tyVarList openTypeKind
 
+openAlphaTy, openBetaTy :: Type
 openAlphaTy = mkTyVarTy openAlphaTyVar
 openAlphaTy = mkTyVarTy openAlphaTyVar
-openBetaTy   = mkTyVarTy openBetaTyVar
+openBetaTy  = mkTyVarTy openBetaTyVar
+
+argAlphaTyVar, argBetaTyVar :: TyVar
+(argAlphaTyVar : argBetaTyVar : _) = tyVarList argTypeKind
+argAlphaTy, argBetaTy :: Type
+argAlphaTy = mkTyVarTy argAlphaTyVar
+argBetaTy  = mkTyVarTy argBetaTyVar
+\end{code}
+
+
+%************************************************************************
+%*                                                                     *
+               Any
+%*                                                                     *
+%************************************************************************
+
+Note [Any types]
+~~~~~~~~~~~~~~~~
+The type constructor Any::* has these properties
+
+  * It is defined in module GHC.Prim, and exported so that it is 
+    available to users.  For this reason it's treated like any other 
+    primitive type:
+      - has a fixed unique, anyTyConKey, 
+      - lives in the global name cache
+      - built with TyCon.PrimTyCon
+
+  * It is lifted, and hence represented by a pointer
+
+  * It is inhabited by at least one value, namely bottom
+
+  * You can unsafely coerce any lifted type to Ayny, and back.
+
+  * It does not claim to be a *data* type, and that's important for
+    the code generator, because the code gen may *enter* a data value
+    but never enters a function value. 
+
+  * It is used to instantiate otherwise un-constrained type variables of kind *
+    For example        length Any []
+    See Note [Strangely-kinded void TyCons]
+
+In addition, we have a potentially-infinite family of types, one for
+each kind /other than/ *, needed to instantiate otherwise
+un-constrained type variables of kinds other than *.  This is a bit
+like tuples; there is a potentially-infinite family.  They have slightly
+different characteristics to Any::*:
+  
+  * They are built with TyCon.AnyTyCon
+  * They have non-user-writable names like "Any(*->*)" 
+  * They are not exported by GHC.Prim
+  * They are uninhabited (of course; not kind *)
+  * They have a unique derived from their OccName (see Note [Uniques of Any])
+  * Their Names do not live in the global name cache
+
+Note [Uniques of Any]
+~~~~~~~~~~~~~~~~~~~~~
+Although Any(*->*), say, doesn't have a binding site, it still needs
+to have a Unique.  Unlike tuples (which are also an infinite family)
+there is no convenient way to index them, so we use the Unique from
+their OccName instead.  That should be unique, 
+  - both wrt each other, because their strings differ
+
+  - and wrt any other Name, because Names get uniques with 
+    various 'char' tags, but the OccName of Any will 
+    get a Unique built with mkTcOccUnique, which has a particular 'char' 
+    tag; see Unique.mkTcOccUnique!
+
+Note [Strangely-kinded void TyCons]
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+See Trac #959 for more examples
+
+When the type checker finds a type variable with no binding, which
+means it can be instantiated with an arbitrary type, it usually
+instantiates it to Void.  Eg.
+
+       length []
+===>
+       length Any (Nil Any)
+
+But in really obscure programs, the type variable might have a kind
+other than *, so we need to invent a suitably-kinded type.
+
+This commit uses
+       Any for kind *
+       Any(*->*) for kind *->*
+       etc
+
+\begin{code}
+anyTyConName :: Name
+anyTyConName = mkPrimTc (fsLit "Any") anyTyConKey anyTyCon
+
+anyTyCon :: TyCon
+anyTyCon = mkLiftedPrimTyCon anyTyConName liftedTypeKind 0 PtrRep
+
+anyTypeOfKind :: Kind -> Type
+anyTypeOfKind kind = mkTyConApp (anyTyConOfKind kind) []
+
+anyTyConOfKind :: Kind -> TyCon
+-- Map all superkinds of liftedTypeKind to liftedTypeKind
+anyTyConOfKind kind 
+  | liftedTypeKind `isSubKind` kind = anyTyCon
+  | otherwise                       = tycon
+  where
+         -- Derive the name from the kind, thus:
+         --     Any(*->*), Any(*->*->*)
+         -- These are names that can't be written by the user,
+         -- and are not allocated in the global name cache
+    str = "Any" ++ showSDoc (pprParendKind kind)
+
+    occ   = mkTcOcc str
+    uniq  = getUnique occ  -- See Note [Uniques of Any]
+    name  = mkWiredInName gHC_PRIM occ uniq (ATyCon tycon) UserSyntax
+    tycon = mkAnyTyCon name kind 
 \end{code}
 
 
 \end{code}
 
 
@@ -207,34 +318,54 @@ pcPrimTyCon0 name rep
   where
     result_kind = unliftedTypeKind
 
   where
     result_kind = unliftedTypeKind
 
+charPrimTy :: Type
 charPrimTy     = mkTyConTy charPrimTyCon
 charPrimTy     = mkTyConTy charPrimTyCon
+charPrimTyCon :: TyCon
 charPrimTyCon  = pcPrimTyCon0 charPrimTyConName WordRep
 
 charPrimTyCon  = pcPrimTyCon0 charPrimTyConName WordRep
 
+intPrimTy :: Type
 intPrimTy      = mkTyConTy intPrimTyCon
 intPrimTy      = mkTyConTy intPrimTyCon
+intPrimTyCon :: TyCon
 intPrimTyCon   = pcPrimTyCon0 intPrimTyConName IntRep
 
 intPrimTyCon   = pcPrimTyCon0 intPrimTyConName IntRep
 
+int32PrimTy :: Type
 int32PrimTy    = mkTyConTy int32PrimTyCon
 int32PrimTy    = mkTyConTy int32PrimTyCon
+int32PrimTyCon :: TyCon
 int32PrimTyCon = pcPrimTyCon0 int32PrimTyConName IntRep
 
 int32PrimTyCon = pcPrimTyCon0 int32PrimTyConName IntRep
 
+int64PrimTy :: Type
 int64PrimTy    = mkTyConTy int64PrimTyCon
 int64PrimTy    = mkTyConTy int64PrimTyCon
+int64PrimTyCon :: TyCon
 int64PrimTyCon = pcPrimTyCon0 int64PrimTyConName Int64Rep
 
 int64PrimTyCon = pcPrimTyCon0 int64PrimTyConName Int64Rep
 
+wordPrimTy :: Type
 wordPrimTy     = mkTyConTy wordPrimTyCon
 wordPrimTy     = mkTyConTy wordPrimTyCon
+wordPrimTyCon :: TyCon
 wordPrimTyCon  = pcPrimTyCon0 wordPrimTyConName WordRep
 
 wordPrimTyCon  = pcPrimTyCon0 wordPrimTyConName WordRep
 
+word32PrimTy :: Type
 word32PrimTy   = mkTyConTy word32PrimTyCon
 word32PrimTy   = mkTyConTy word32PrimTyCon
+word32PrimTyCon :: TyCon
 word32PrimTyCon        = pcPrimTyCon0 word32PrimTyConName WordRep
 
 word32PrimTyCon        = pcPrimTyCon0 word32PrimTyConName WordRep
 
+word64PrimTy :: Type
 word64PrimTy   = mkTyConTy word64PrimTyCon
 word64PrimTy   = mkTyConTy word64PrimTyCon
+word64PrimTyCon :: TyCon
 word64PrimTyCon        = pcPrimTyCon0 word64PrimTyConName Word64Rep
 
 word64PrimTyCon        = pcPrimTyCon0 word64PrimTyConName Word64Rep
 
+addrPrimTy :: Type
 addrPrimTy     = mkTyConTy addrPrimTyCon
 addrPrimTy     = mkTyConTy addrPrimTyCon
+addrPrimTyCon :: TyCon
 addrPrimTyCon  = pcPrimTyCon0 addrPrimTyConName AddrRep
 
 addrPrimTyCon  = pcPrimTyCon0 addrPrimTyConName AddrRep
 
+floatPrimTy    :: Type
 floatPrimTy    = mkTyConTy floatPrimTyCon
 floatPrimTy    = mkTyConTy floatPrimTyCon
+floatPrimTyCon :: TyCon
 floatPrimTyCon = pcPrimTyCon0 floatPrimTyConName FloatRep
 
 floatPrimTyCon = pcPrimTyCon0 floatPrimTyConName FloatRep
 
+doublePrimTy :: Type
 doublePrimTy   = mkTyConTy doublePrimTyCon
 doublePrimTy   = mkTyConTy doublePrimTyCon
+doublePrimTyCon        :: TyCon
 doublePrimTyCon        = pcPrimTyCon0 doublePrimTyConName DoubleRep
 \end{code}
 
 doublePrimTyCon        = pcPrimTyCon0 doublePrimTyConName DoubleRep
 \end{code}
 
@@ -255,7 +386,9 @@ where s is a type variable. The only purpose of the type parameter is to
 keep different state threads separate.  It is represented by nothing at all.
 
 \begin{code}
 keep different state threads separate.  It is represented by nothing at all.
 
 \begin{code}
+mkStatePrimTy :: Type -> Type
 mkStatePrimTy ty = mkTyConApp statePrimTyCon [ty]
 mkStatePrimTy ty = mkTyConApp statePrimTyCon [ty]
+statePrimTyCon :: TyCon
 statePrimTyCon  = pcPrimTyCon statePrimTyConName 1 VoidRep
 \end{code}
 
 statePrimTyCon  = pcPrimTyCon statePrimTyConName 1 VoidRep
 \end{code}
 
@@ -264,8 +397,11 @@ RealWorld is deeply magical.  It is *primitive*, but it is not
 RealWorld; it's only used in the type system, to parameterise State#.
 
 \begin{code}
 RealWorld; it's only used in the type system, to parameterise State#.
 
 \begin{code}
+realWorldTyCon :: TyCon
 realWorldTyCon = mkLiftedPrimTyCon realWorldTyConName liftedTypeKind 0 PtrRep
 realWorldTyCon = mkLiftedPrimTyCon realWorldTyConName liftedTypeKind 0 PtrRep
+realWorldTy :: Type
 realWorldTy         = mkTyConTy realWorldTyCon
 realWorldTy         = mkTyConTy realWorldTyCon
+realWorldStatePrimTy :: Type
 realWorldStatePrimTy = mkStatePrimTy realWorldTy       -- State# RealWorld
 \end{code}
 
 realWorldStatePrimTy = mkStatePrimTy realWorldTy       -- State# RealWorld
 \end{code}
 
@@ -275,65 +411,25 @@ defined in \tr{TysWiredIn.lhs}, not here.
 
 %************************************************************************
 %*                                                                     *
 
 %************************************************************************
 %*                                                                     *
-               Any
-%*                                                                     *
-%************************************************************************
-
-The type constructor Any is type to which you can unsafely coerce any
-lifted type, and back. 
-
-  * It is lifted, and hence represented by a pointer
-
-  * It does not claim to be a *data* type, and that's important for
-    the code generator, because the code gen may *enter* a data value
-    but never enters a function value.  
-
-It's also used to instantiate un-constrained type variables after type
-checking.  For example
-       lenth Any []
-Annoyingly, we sometimes need Anys of other kinds, such as (*->*) etc.
-This is a bit like tuples.   We define a couple of useful ones here,
-and make others up on the fly.  If any of these others end up being exported
-into interface files, we'll get a crash; at least until we add interface-file
-syntax to support them.
-
-\begin{code}
-anyPrimTy = mkTyConApp anyPrimTyCon []
-
-anyPrimTyCon :: TyCon  -- Kind *
-anyPrimTyCon = mkLiftedPrimTyCon anyPrimTyConName liftedTypeKind 0 PtrRep
-
-anyPrimTyCon1 :: TyCon         -- Kind *->*
-anyPrimTyCon1 = mkLiftedPrimTyCon anyPrimTyCon1Name kind 0 PtrRep
-  where
-    kind = mkArrowKind liftedTypeKind liftedTypeKind
-                                 
-mkAnyPrimTyCon :: Unique -> Kind -> TyCon
--- Grotesque hack alert: the client gives the unique; so equality won't work
-mkAnyPrimTyCon uniq kind 
-  = pprTrace "Urk! Inventing strangely-kinded Any TyCon:" (ppr uniq <+> ppr kind)
-    tycon
-  where
-     name  = mkPrimTc (mkFastString ("Any" ++ showSDoc (pprUnique uniq))) uniq tycon
-     tycon = mkLiftedPrimTyCon name kind 0 PtrRep
-\end{code}
-
-
-%************************************************************************
-%*                                                                     *
 \subsection[TysPrim-arrays]{The primitive array types}
 %*                                                                     *
 %************************************************************************
 
 \begin{code}
 \subsection[TysPrim-arrays]{The primitive array types}
 %*                                                                     *
 %************************************************************************
 
 \begin{code}
+arrayPrimTyCon, mutableArrayPrimTyCon, mutableByteArrayPrimTyCon,
+    byteArrayPrimTyCon :: TyCon
 arrayPrimTyCon           = pcPrimTyCon  arrayPrimTyConName            1 PtrRep
 mutableArrayPrimTyCon    = pcPrimTyCon  mutableArrayPrimTyConName     2 PtrRep
 mutableByteArrayPrimTyCon = pcPrimTyCon  mutableByteArrayPrimTyConName 1 PtrRep
 byteArrayPrimTyCon       = pcPrimTyCon0 byteArrayPrimTyConName          PtrRep
 
 arrayPrimTyCon           = pcPrimTyCon  arrayPrimTyConName            1 PtrRep
 mutableArrayPrimTyCon    = pcPrimTyCon  mutableArrayPrimTyConName     2 PtrRep
 mutableByteArrayPrimTyCon = pcPrimTyCon  mutableByteArrayPrimTyConName 1 PtrRep
 byteArrayPrimTyCon       = pcPrimTyCon0 byteArrayPrimTyConName          PtrRep
 
+mkArrayPrimTy :: Type -> Type
 mkArrayPrimTy elt          = mkTyConApp arrayPrimTyCon [elt]
 mkArrayPrimTy elt          = mkTyConApp arrayPrimTyCon [elt]
+byteArrayPrimTy :: Type
 byteArrayPrimTy                    = mkTyConTy byteArrayPrimTyCon
 byteArrayPrimTy                    = mkTyConTy byteArrayPrimTyCon
+mkMutableArrayPrimTy :: Type -> Type -> Type
 mkMutableArrayPrimTy s elt  = mkTyConApp mutableArrayPrimTyCon [s, elt]
 mkMutableArrayPrimTy s elt  = mkTyConApp mutableArrayPrimTyCon [s, elt]
+mkMutableByteArrayPrimTy :: Type -> Type
 mkMutableByteArrayPrimTy s  = mkTyConApp mutableByteArrayPrimTyCon [s]
 \end{code}
 
 mkMutableByteArrayPrimTy s  = mkTyConApp mutableByteArrayPrimTyCon [s]
 \end{code}
 
@@ -344,8 +440,10 @@ mkMutableByteArrayPrimTy s  = mkTyConApp mutableByteArrayPrimTyCon [s]
 %************************************************************************
 
 \begin{code}
 %************************************************************************
 
 \begin{code}
+mutVarPrimTyCon :: TyCon
 mutVarPrimTyCon = pcPrimTyCon mutVarPrimTyConName 2 PtrRep
 
 mutVarPrimTyCon = pcPrimTyCon mutVarPrimTyConName 2 PtrRep
 
+mkMutVarPrimTy :: Type -> Type -> Type
 mkMutVarPrimTy s elt       = mkTyConApp mutVarPrimTyCon [s, elt]
 \end{code}
 
 mkMutVarPrimTy s elt       = mkTyConApp mutVarPrimTyCon [s, elt]
 \end{code}
 
@@ -356,8 +454,10 @@ mkMutVarPrimTy s elt           = mkTyConApp mutVarPrimTyCon [s, elt]
 %************************************************************************
 
 \begin{code}
 %************************************************************************
 
 \begin{code}
+mVarPrimTyCon :: TyCon
 mVarPrimTyCon = pcPrimTyCon mVarPrimTyConName 2 PtrRep
 
 mVarPrimTyCon = pcPrimTyCon mVarPrimTyConName 2 PtrRep
 
+mkMVarPrimTy :: Type -> Type -> Type
 mkMVarPrimTy s elt         = mkTyConApp mVarPrimTyCon [s, elt]
 \end{code}
 
 mkMVarPrimTy s elt         = mkTyConApp mVarPrimTyCon [s, elt]
 \end{code}
 
@@ -368,9 +468,11 @@ mkMVarPrimTy s elt             = mkTyConApp mVarPrimTyCon [s, elt]
 %************************************************************************
 
 \begin{code}
 %************************************************************************
 
 \begin{code}
+tVarPrimTyCon :: TyCon
 tVarPrimTyCon = pcPrimTyCon tVarPrimTyConName 2 PtrRep
 
 tVarPrimTyCon = pcPrimTyCon tVarPrimTyConName 2 PtrRep
 
-mkTVarPrimTy s elt         = mkTyConApp tVarPrimTyCon [s, elt]
+mkTVarPrimTy :: Type -> Type -> Type
+mkTVarPrimTy s elt = mkTyConApp tVarPrimTyCon [s, elt]
 \end{code}
 
 %************************************************************************
 \end{code}
 
 %************************************************************************
@@ -380,8 +482,10 @@ mkTVarPrimTy s elt             = mkTyConApp tVarPrimTyCon [s, elt]
 %************************************************************************
 
 \begin{code}
 %************************************************************************
 
 \begin{code}
+stablePtrPrimTyCon :: TyCon
 stablePtrPrimTyCon = pcPrimTyCon stablePtrPrimTyConName 1 AddrRep
 
 stablePtrPrimTyCon = pcPrimTyCon stablePtrPrimTyConName 1 AddrRep
 
+mkStablePtrPrimTy :: Type -> Type
 mkStablePtrPrimTy ty = mkTyConApp stablePtrPrimTyCon [ty]
 \end{code}
 
 mkStablePtrPrimTy ty = mkTyConApp stablePtrPrimTyCon [ty]
 \end{code}
 
@@ -392,8 +496,10 @@ mkStablePtrPrimTy ty = mkTyConApp stablePtrPrimTyCon [ty]
 %************************************************************************
 
 \begin{code}
 %************************************************************************
 
 \begin{code}
+stableNamePrimTyCon :: TyCon
 stableNamePrimTyCon = pcPrimTyCon stableNamePrimTyConName 1 PtrRep
 
 stableNamePrimTyCon = pcPrimTyCon stableNamePrimTyConName 1 PtrRep
 
+mkStableNamePrimTy :: Type -> Type
 mkStableNamePrimTy ty = mkTyConApp stableNamePrimTyCon [ty]
 \end{code}
 
 mkStableNamePrimTy ty = mkTyConApp stableNamePrimTyCon [ty]
 \end{code}
 
@@ -404,7 +510,9 @@ mkStableNamePrimTy ty = mkTyConApp stableNamePrimTyCon [ty]
 %************************************************************************
 
 \begin{code}
 %************************************************************************
 
 \begin{code}
+bcoPrimTy    :: Type
 bcoPrimTy    = mkTyConTy bcoPrimTyCon
 bcoPrimTy    = mkTyConTy bcoPrimTyCon
+bcoPrimTyCon :: TyCon
 bcoPrimTyCon = pcPrimTyCon0 bcoPrimTyConName PtrRep
 \end{code}
   
 bcoPrimTyCon = pcPrimTyCon0 bcoPrimTyConName PtrRep
 \end{code}
   
@@ -415,8 +523,10 @@ bcoPrimTyCon = pcPrimTyCon0 bcoPrimTyConName PtrRep
 %************************************************************************
 
 \begin{code}
 %************************************************************************
 
 \begin{code}
+weakPrimTyCon :: TyCon
 weakPrimTyCon = pcPrimTyCon weakPrimTyConName 1 PtrRep
 
 weakPrimTyCon = pcPrimTyCon weakPrimTyConName 1 PtrRep
 
+mkWeakPrimTy :: Type -> Type
 mkWeakPrimTy v = mkTyConApp weakPrimTyCon [v]
 \end{code}
 
 mkWeakPrimTy v = mkTyConApp weakPrimTyCon [v]
 \end{code}
 
@@ -436,6 +546,8 @@ Hence the programmer API for thread manipulation uses a weak pointer
 to the thread id internally.
 
 \begin{code}
 to the thread id internally.
 
 \begin{code}
+threadIdPrimTy :: Type
 threadIdPrimTy    = mkTyConTy threadIdPrimTyCon
 threadIdPrimTy    = mkTyConTy threadIdPrimTyCon
+threadIdPrimTyCon :: TyCon
 threadIdPrimTyCon = pcPrimTyCon0 threadIdPrimTyConName PtrRep
 \end{code}
 threadIdPrimTyCon = pcPrimTyCon0 threadIdPrimTyConName PtrRep
 \end{code}