[project @ 1998-05-08 15:01:57 by simonm]
authorsimonm <unknown>
Fri, 8 May 1998 15:02:07 +0000 (15:02 +0000)
committersimonm <unknown>
Fri, 8 May 1998 15:02:07 +0000 (15:02 +0000)
Add
PrelGHC.unsafeCoerce# ::  a -> b

Use with care.

ghc/compiler/basicTypes/Unique.lhs
ghc/compiler/prelude/PrelInfo.lhs
ghc/compiler/prelude/PrelVals.lhs

index 2a79917..040bf5f 100644 (file)
@@ -204,6 +204,7 @@ module Unique (
        unpackCStringFoldrIdKey,
        unpackCStringIdKey,
        ureadListIdKey,
+       unsafeCoerceIdKey,
        ushowListIdKey,
        voidIdKey,
        voidTyConKey,
@@ -666,48 +667,49 @@ unpackCString2IdKey             = mkPreludeMiscIdUnique 36
 unpackCStringAppendIdKey      = mkPreludeMiscIdUnique 37
 unpackCStringFoldrIdKey              = mkPreludeMiscIdUnique 38
 unpackCStringIdKey           = mkPreludeMiscIdUnique 39
-voidIdKey                    = mkPreludeMiscIdUnique 40
-ushowListIdKey               = mkPreludeMiscIdUnique 41
-ureadListIdKey               = mkPreludeMiscIdUnique 42
-
-copyableIdKey          = mkPreludeMiscIdUnique 43
-noFollowIdKey          = mkPreludeMiscIdUnique 44
-parAtAbsIdKey          = mkPreludeMiscIdUnique 45
-parAtForNowIdKey       = mkPreludeMiscIdUnique 46
-parAtIdKey             = mkPreludeMiscIdUnique 47
-parAtRelIdKey          = mkPreludeMiscIdUnique 48
-parGlobalIdKey         = mkPreludeMiscIdUnique 49
-parLocalIdKey          = mkPreludeMiscIdUnique 50
+unsafeCoerceIdKey            = mkPreludeMiscIdUnique 40
+voidIdKey                    = mkPreludeMiscIdUnique 41
+ushowListIdKey               = mkPreludeMiscIdUnique 42
+ureadListIdKey               = mkPreludeMiscIdUnique 43
+
+copyableIdKey          = mkPreludeMiscIdUnique 44
+noFollowIdKey          = mkPreludeMiscIdUnique 45
+parAtAbsIdKey          = mkPreludeMiscIdUnique 46
+parAtForNowIdKey       = mkPreludeMiscIdUnique 47
+parAtIdKey             = mkPreludeMiscIdUnique 48
+parAtRelIdKey          = mkPreludeMiscIdUnique 49
+parGlobalIdKey         = mkPreludeMiscIdUnique 50
+parLocalIdKey          = mkPreludeMiscIdUnique 51
 \end{code}
 
 Certain class operations from Prelude classes.  They get
 their own uniques so we can look them up easily when we want
 to conjure them up during type checking.        
 \begin{code}                                     
-fromIntClassOpKey      = mkPreludeMiscIdUnique 51
-fromIntegerClassOpKey  = mkPreludeMiscIdUnique 52
-minusClassOpKey                = mkPreludeMiscIdUnique 53
-fromRationalClassOpKey = mkPreludeMiscIdUnique 54
-enumFromClassOpKey     = mkPreludeMiscIdUnique 55
-enumFromThenClassOpKey = mkPreludeMiscIdUnique 56
-enumFromToClassOpKey   = mkPreludeMiscIdUnique 57
-enumFromThenToClassOpKey= mkPreludeMiscIdUnique 58
-eqClassOpKey           = mkPreludeMiscIdUnique 59
-geClassOpKey           = mkPreludeMiscIdUnique 60
-zeroClassOpKey         = mkPreludeMiscIdUnique 61
-thenMClassOpKey                = mkPreludeMiscIdUnique 62 -- (>>=)
-unboundKey             = mkPreludeMiscIdUnique 63      -- Just a place holder for unbound
+fromIntClassOpKey      = mkPreludeMiscIdUnique 52
+fromIntegerClassOpKey  = mkPreludeMiscIdUnique 53
+minusClassOpKey                = mkPreludeMiscIdUnique 54
+fromRationalClassOpKey = mkPreludeMiscIdUnique 55
+enumFromClassOpKey     = mkPreludeMiscIdUnique 56
+enumFromThenClassOpKey = mkPreludeMiscIdUnique 57
+enumFromToClassOpKey   = mkPreludeMiscIdUnique 58
+enumFromThenToClassOpKey= mkPreludeMiscIdUnique 59
+eqClassOpKey           = mkPreludeMiscIdUnique 50
+geClassOpKey           = mkPreludeMiscIdUnique 61
+zeroClassOpKey         = mkPreludeMiscIdUnique 62
+thenMClassOpKey                = mkPreludeMiscIdUnique 63 -- (>>=)
+unboundKey             = mkPreludeMiscIdUnique 64      -- Just a place holder for unbound
                                                        -- variables produced by the renamer
-fromEnumClassOpKey     = mkPreludeMiscIdUnique 64
+fromEnumClassOpKey     = mkPreludeMiscIdUnique 65
 
-mainKey                        = mkPreludeMiscIdUnique 65
-returnMClassOpKey      = mkPreludeMiscIdUnique 66
-otherwiseIdKey         = mkPreludeMiscIdUnique 67
-toEnumClassOpKey       = mkPreludeMiscIdUnique 68
+mainKey                        = mkPreludeMiscIdUnique 66
+returnMClassOpKey      = mkPreludeMiscIdUnique 67
+otherwiseIdKey         = mkPreludeMiscIdUnique 68
+toEnumClassOpKey       = mkPreludeMiscIdUnique 69
 \end{code}
 
 \begin{code}
-inlineIdKey            = mkPreludeMiscIdUnique 69
-coerceIdKey            = mkPreludeMiscIdUnique 70
-assertIdKey            = mkPreludeMiscIdUnique 71
+inlineIdKey            = mkPreludeMiscIdUnique 70
+coerceIdKey            = mkPreludeMiscIdUnique 71
+assertIdKey            = mkPreludeMiscIdUnique 72
 \end{code}
index 692e675..d6caf24 100644 (file)
@@ -208,6 +208,7 @@ wired_in_ids
     , unpackCStringAppendId
     , unpackCStringFoldrId
     , unpackCStringId
+    , unsafeCoerceId
     , voidId
 
 --  , copyableId
index b22559b..1aea62c 100644 (file)
@@ -116,6 +116,21 @@ errorTy  = mkSigmaTy [openAlphaTyVar] [] (mkFunTys [mkListTy charTy] openAlphaTy
     -- returns, so the return type is irrelevant.
 \end{code}
 
+unsafeCoerce# isn't so much a PrimOp as a phantom identifier, that
+just gets expanded into a type coercion wherever it occurs.  Hence we
+add it as a built-in Id with an unfolding here.
+
+\begin{code}
+unsafeCoerceId
+  = pcMiscPrelId unsafeCoerceIdKey pREL_GHC SLIT("unsafeCoerce#") ty
+       (mk_inline_unfolding template)
+  where
+    ty = mkForAllTys [alphaTyVar,betaTyVar] (mkFunTy alphaTy betaTy)
+    [x] = mkTemplateLocals [alphaTy]
+    template = mkLam [alphaTyVar,betaTyVar] [x] (
+                 Note (Coerce betaTy alphaTy) (Var x))
+\end{code}
+
 We want \tr{GHCbase.trace} to be wired in
 because we don't want the strictness analyser to get ahold of it,
 decide that the second argument is strict, evaluate that first (!!),