Comments about naming for data constructors
[ghc-hetmet.git] / compiler / basicTypes / MkId.lhs
index 1fe712b..b28b985 100644 (file)
@@ -35,7 +35,7 @@ module MkId (
         unsafeCoerceId, realWorldPrimId, voidArgId, nullAddrId, seqId,
         lazyId, lazyIdUnfolding, lazyIdKey,
 
-        mkRuntimeErrorApp,
+        mkRuntimeErrorApp, mkImpossibleExpr,
         rEC_CON_ERROR_ID, iRREFUT_PAT_ERROR_ID, rUNTIME_ERROR_ID,
         nON_EXHAUSTIVE_GUARDS_ERROR_ID, nO_METHOD_BINDING_ERROR_ID,
         pAT_ERROR_ID, eRROR_ID, rEC_SEL_ERROR_ID,
@@ -53,7 +53,7 @@ import Type
 import TypeRep
 import Coercion
 import TcType
-import CoreUtils
+import CoreUtils       ( exprType, mkCoerce )
 import CoreUnfold
 import Literal
 import TyCon
@@ -86,17 +86,42 @@ import Module
 %*                                                                      *
 %************************************************************************
 
+Note [Wired-in Ids]
+~~~~~~~~~~~~~~~~~~~
+There are several reasons why an Id might appear in the wiredInIds:
+
+(1) The ghcPrimIds are wired in because they can't be defined in
+    Haskell at all, although the can be defined in Core.  They have
+    compulsory unfoldings, so they are always inlined and they  have
+    no definition site.  Their home module is GHC.Prim, so they
+    also have a description in primops.txt.pp, where they are called
+    'pseudoops'.
+
+(2) The 'error' function, eRROR_ID, is wired in because we don't yet have
+    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]
+
+(3) Other error functions (rUNTIME_ERROR_ID) are wired in (a) because
+    the desugarer generates code that mentiones them directly, and
+    (b) for the same reason as eRROR_ID
+
+(4) lazyId is wired in because the wired-in version overrides the
+    strictness of the version defined in GHC.Base
+
+In cases (2-4), the function has a definition in a library module, and
+can be called; but the wired-in version means that the details are 
+never read from that module's interface file; instead, the full definition
+is right here.
+
 \begin{code}
 wiredInIds :: [Id]
 wiredInIds
-  = [   -- These error-y things are wired in because we don't yet have
-        -- 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]
+  = [   
 
     eRROR_ID,   -- This one isn't used anywhere else in the compiler
                 -- But we still need it in wiredInIds so that when GHC
@@ -977,6 +1002,10 @@ mkRuntimeErrorApp err_id res_ty err_msg
   where
     err_string = Lit (mkMachString err_msg)
 
+mkImpossibleExpr :: Type -> CoreExpr
+mkImpossibleExpr res_ty
+  = mkRuntimeErrorApp rUNTIME_ERROR_ID res_ty "Impossible case alternative"
+
 rEC_SEL_ERROR_ID                = mkRuntimeErrorId recSelErrorName
 rUNTIME_ERROR_ID                = mkRuntimeErrorId runtimeErrorName
 iRREFUT_PAT_ERROR_ID            = mkRuntimeErrorId irrefutPatErrorName