From c9898dcb4544634e3fab247960e1f132f73e398e Mon Sep 17 00:00:00 2001 From: simonm Date: Fri, 8 May 1998 15:02:07 +0000 Subject: [PATCH] [project @ 1998-05-08 15:01:57 by simonm] Add PrelGHC.unsafeCoerce# :: a -> b Use with care. --- ghc/compiler/basicTypes/Unique.lhs | 68 +++++++++++++++++++----------------- ghc/compiler/prelude/PrelInfo.lhs | 1 + ghc/compiler/prelude/PrelVals.lhs | 15 ++++++++ 3 files changed, 51 insertions(+), 33 deletions(-) diff --git a/ghc/compiler/basicTypes/Unique.lhs b/ghc/compiler/basicTypes/Unique.lhs index 2a79917..040bf5f 100644 --- a/ghc/compiler/basicTypes/Unique.lhs +++ b/ghc/compiler/basicTypes/Unique.lhs @@ -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} diff --git a/ghc/compiler/prelude/PrelInfo.lhs b/ghc/compiler/prelude/PrelInfo.lhs index 692e675..d6caf24 100644 --- a/ghc/compiler/prelude/PrelInfo.lhs +++ b/ghc/compiler/prelude/PrelInfo.lhs @@ -208,6 +208,7 @@ wired_in_ids , unpackCStringAppendId , unpackCStringFoldrId , unpackCStringId + , unsafeCoerceId , voidId -- , copyableId diff --git a/ghc/compiler/prelude/PrelVals.lhs b/ghc/compiler/prelude/PrelVals.lhs index b22559b..1aea62c 100644 --- a/ghc/compiler/prelude/PrelVals.lhs +++ b/ghc/compiler/prelude/PrelVals.lhs @@ -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 (!!), -- 1.7.10.4