Eliminate over-zealous warning in CoreToStg
authorsimonpj@microsoft.com <unknown>
Tue, 16 Oct 2007 12:46:06 +0000 (12:46 +0000)
committersimonpj@microsoft.com <unknown>
Tue, 16 Oct 2007 12:46:06 +0000 (12:46 +0000)
compiler/stgSyn/CoreToStg.lhs
compiler/types/TyCon.lhs

index 51e830c..91c9a20 100644 (file)
@@ -563,9 +563,15 @@ coreToStgArgs (arg : args) -- Non-type argument
     let
        arg_ty = exprType arg
        stg_arg_ty = stgArgType stg_arg
+       bad_args = (isUnLiftedType arg_ty && not (isUnLiftedType stg_arg_ty)) 
+               || (typePrimRep arg_ty /= typePrimRep stg_arg_ty)
+       -- In GHCi we coerce an argument of type BCO# (unlifted) to HValue (lifted), 
+       -- and pass it to a function expecting an HValue (arg_ty).  This is ok because
+       -- we can treat an unlifted value as lifted.  But the other way round 
+       -- we complain.
+       -- We also want to check if a pointer is cast to a non-ptr etc
     in
-    WARN( isUnLiftedType arg_ty /= isUnLiftedType stg_arg_ty, 
-         ptext SLIT("Dangerous-looking argument. Probable cause: bad unsafeCoerce#") $$ ppr arg)
+    WARN( bad_args, ptext SLIT("Dangerous-looking argument. Probable cause: bad unsafeCoerce#") $$ ppr arg )
     returnLne (stg_arg : stg_args, fvs)
 
 
index 0ac3bf0..84d16e0 100644 (file)
@@ -475,6 +475,7 @@ data PrimRep
   | AddrRep            -- a pointer, but not to a Haskell value
   | FloatRep
   | DoubleRep
+  deriving( Eq )
 
 -- Size of a PrimRep, in bytes
 sizeofPrimRep :: PrimRep -> Int