summaryrefslogtreecommitdiff
path: root/testsuite/tests
diff options
context:
space:
mode:
authorSylvain Henry <sylvain@haskus.fr>2021-05-31 15:47:56 +0200
committerMarge Bot <ben+marge-bot@smart-cactus.org>2021-08-09 15:11:23 -0400
commit748636388b052d22859b7265dec776edfa12a68c (patch)
tree3193ecc47420dbf522ce945f3c1d57254833aaeb /testsuite/tests
parentb128a880b225d3abc98f58a0426b58138aed5504 (diff)
downloadhaskell-748636388b052d22859b7265dec776edfa12a68c.tar.gz
Remove ad-hoc fromIntegral rules
fromIntegral is defined as: {-# NOINLINE [1] fromIntegral #-} fromIntegral :: (Integral a, Num b) => a -> b fromIntegral = fromInteger . toInteger Before this patch, we had a lot of rewrite rules for fromIntegral, to avoid passing through Integer when there is a faster way, e.g.: "fromIntegral/Int->Word" fromIntegral = \(I# x#) -> W# (int2Word# x#) "fromIntegral/Word->Int" fromIntegral = \(W# x#) -> I# (word2Int# x#) "fromIntegral/Word->Word" fromIntegral = id :: Word -> Word Since we have added sized types and primops (Word8#, Int16#, etc.) and Natural, this approach didn't really scale as there is a combinatorial explosion of types. In addition, we really want these conversions to be optimized for all these types and in every case (not only when fromIntegral is explicitly used). This patch removes all those ad-hoc fromIntegral rules. Instead we rely on inlining and built-in constant-folding rules. There are not too many native conversions between Integer/Natural and fixed size types, so we can handle them all explicitly. Foreign.C.Types was using rules to ensure that fromIntegral rules "sees" through the newtype wrappers,e.g.: {-# RULES "fromIntegral/a->CSize" fromIntegral = \x -> CSize (fromIntegral x) "fromIntegral/CSize->a" fromIntegral = \(CSize x) -> fromIntegral x #-} But they aren't necessary because coercions due to newtype deriving are pushed out of the way. So this patch removes these rules (as fromIntegral is now inlined, they won't match anymore anyway). Summary: * INLINE `fromIntegral` * Add some missing constant-folding rules * Remove every fromIntegral ad-hoc rules (fix #19907) Fix #20062 (missing fromIntegral rules for sized primitives) Performance: - T12545 wiggles (tracked by #19414) Metric Decrease: T12545 T10359 Metric Increase: T12545
Diffstat (limited to 'testsuite/tests')
-rw-r--r--testsuite/tests/numeric/should_compile/T20062.hs1008
-rw-r--r--testsuite/tests/numeric/should_compile/all.T1
2 files changed, 1009 insertions, 0 deletions
diff --git a/testsuite/tests/numeric/should_compile/T20062.hs b/testsuite/tests/numeric/should_compile/T20062.hs
new file mode 100644
index 0000000000..f4c5024313
--- /dev/null
+++ b/testsuite/tests/numeric/should_compile/T20062.hs
@@ -0,0 +1,1008 @@
+module T20062 where
+
+import GHC.Int
+import GHC.Word
+import Data.Char
+import Control.Monad
+import Foreign.C.Types
+
+---------------------------------------------------------------
+-- This is used to generate the code that is copy-pasted below
+---------------------------------------------------------------
+
+types :: [String]
+types = [ "Word64", "Word32", "Word16", "Word8"
+ , "Int64" , "Int32" , "Int16" , "Int8"
+ , "CChar" , "CUShort", "CUInt", "CULong", "CULLong"
+ , "CSChar", "CShort" , "CInt" , "CLong" , "CLLong"
+ ]
+
+main :: IO ()
+main = do
+ forM_ types $ \t1 ->
+ forM_ types $ \t2 -> do
+ let n = fmap toLower t1++"_to_"++fmap toLower t2
+ let t = ":: "++t1++" -> "++t2
+ putStrLn $ mconcat
+ [ n, t, "\n"
+ , n, " = fromIntegral\n"
+ ]
+
+---------------------------------------------------------------
+-- End of generator
+--
+-- Copy-paste of generated code:
+---------------------------------------------------------------
+
+word64_to_word64:: Word64 -> Word64
+word64_to_word64 = fromIntegral
+
+word64_to_word32:: Word64 -> Word32
+word64_to_word32 = fromIntegral
+
+word64_to_word16:: Word64 -> Word16
+word64_to_word16 = fromIntegral
+
+word64_to_word8:: Word64 -> Word8
+word64_to_word8 = fromIntegral
+
+word64_to_int64:: Word64 -> Int64
+word64_to_int64 = fromIntegral
+
+word64_to_int32:: Word64 -> Int32
+word64_to_int32 = fromIntegral
+
+word64_to_int16:: Word64 -> Int16
+word64_to_int16 = fromIntegral
+
+word64_to_int8:: Word64 -> Int8
+word64_to_int8 = fromIntegral
+
+word64_to_cchar:: Word64 -> CChar
+word64_to_cchar = fromIntegral
+
+word64_to_cushort:: Word64 -> CUShort
+word64_to_cushort = fromIntegral
+
+word64_to_cuint:: Word64 -> CUInt
+word64_to_cuint = fromIntegral
+
+word64_to_culong:: Word64 -> CULong
+word64_to_culong = fromIntegral
+
+word64_to_cullong:: Word64 -> CULLong
+word64_to_cullong = fromIntegral
+
+word64_to_cschar:: Word64 -> CSChar
+word64_to_cschar = fromIntegral
+
+word64_to_cshort:: Word64 -> CShort
+word64_to_cshort = fromIntegral
+
+word64_to_cint:: Word64 -> CInt
+word64_to_cint = fromIntegral
+
+word64_to_clong:: Word64 -> CLong
+word64_to_clong = fromIntegral
+
+word64_to_cllong:: Word64 -> CLLong
+word64_to_cllong = fromIntegral
+
+word32_to_word64:: Word32 -> Word64
+word32_to_word64 = fromIntegral
+
+word32_to_word32:: Word32 -> Word32
+word32_to_word32 = fromIntegral
+
+word32_to_word16:: Word32 -> Word16
+word32_to_word16 = fromIntegral
+
+word32_to_word8:: Word32 -> Word8
+word32_to_word8 = fromIntegral
+
+word32_to_int64:: Word32 -> Int64
+word32_to_int64 = fromIntegral
+
+word32_to_int32:: Word32 -> Int32
+word32_to_int32 = fromIntegral
+
+word32_to_int16:: Word32 -> Int16
+word32_to_int16 = fromIntegral
+
+word32_to_int8:: Word32 -> Int8
+word32_to_int8 = fromIntegral
+
+word32_to_cchar:: Word32 -> CChar
+word32_to_cchar = fromIntegral
+
+word32_to_cushort:: Word32 -> CUShort
+word32_to_cushort = fromIntegral
+
+word32_to_cuint:: Word32 -> CUInt
+word32_to_cuint = fromIntegral
+
+word32_to_culong:: Word32 -> CULong
+word32_to_culong = fromIntegral
+
+word32_to_cullong:: Word32 -> CULLong
+word32_to_cullong = fromIntegral
+
+word32_to_cschar:: Word32 -> CSChar
+word32_to_cschar = fromIntegral
+
+word32_to_cshort:: Word32 -> CShort
+word32_to_cshort = fromIntegral
+
+word32_to_cint:: Word32 -> CInt
+word32_to_cint = fromIntegral
+
+word32_to_clong:: Word32 -> CLong
+word32_to_clong = fromIntegral
+
+word32_to_cllong:: Word32 -> CLLong
+word32_to_cllong = fromIntegral
+
+word16_to_word64:: Word16 -> Word64
+word16_to_word64 = fromIntegral
+
+word16_to_word32:: Word16 -> Word32
+word16_to_word32 = fromIntegral
+
+word16_to_word16:: Word16 -> Word16
+word16_to_word16 = fromIntegral
+
+word16_to_word8:: Word16 -> Word8
+word16_to_word8 = fromIntegral
+
+word16_to_int64:: Word16 -> Int64
+word16_to_int64 = fromIntegral
+
+word16_to_int32:: Word16 -> Int32
+word16_to_int32 = fromIntegral
+
+word16_to_int16:: Word16 -> Int16
+word16_to_int16 = fromIntegral
+
+word16_to_int8:: Word16 -> Int8
+word16_to_int8 = fromIntegral
+
+word16_to_cchar:: Word16 -> CChar
+word16_to_cchar = fromIntegral
+
+word16_to_cushort:: Word16 -> CUShort
+word16_to_cushort = fromIntegral
+
+word16_to_cuint:: Word16 -> CUInt
+word16_to_cuint = fromIntegral
+
+word16_to_culong:: Word16 -> CULong
+word16_to_culong = fromIntegral
+
+word16_to_cullong:: Word16 -> CULLong
+word16_to_cullong = fromIntegral
+
+word16_to_cschar:: Word16 -> CSChar
+word16_to_cschar = fromIntegral
+
+word16_to_cshort:: Word16 -> CShort
+word16_to_cshort = fromIntegral
+
+word16_to_cint:: Word16 -> CInt
+word16_to_cint = fromIntegral
+
+word16_to_clong:: Word16 -> CLong
+word16_to_clong = fromIntegral
+
+word16_to_cllong:: Word16 -> CLLong
+word16_to_cllong = fromIntegral
+
+word8_to_word64:: Word8 -> Word64
+word8_to_word64 = fromIntegral
+
+word8_to_word32:: Word8 -> Word32
+word8_to_word32 = fromIntegral
+
+word8_to_word16:: Word8 -> Word16
+word8_to_word16 = fromIntegral
+
+word8_to_word8:: Word8 -> Word8
+word8_to_word8 = fromIntegral
+
+word8_to_int64:: Word8 -> Int64
+word8_to_int64 = fromIntegral
+
+word8_to_int32:: Word8 -> Int32
+word8_to_int32 = fromIntegral
+
+word8_to_int16:: Word8 -> Int16
+word8_to_int16 = fromIntegral
+
+word8_to_int8:: Word8 -> Int8
+word8_to_int8 = fromIntegral
+
+word8_to_cchar:: Word8 -> CChar
+word8_to_cchar = fromIntegral
+
+word8_to_cushort:: Word8 -> CUShort
+word8_to_cushort = fromIntegral
+
+word8_to_cuint:: Word8 -> CUInt
+word8_to_cuint = fromIntegral
+
+word8_to_culong:: Word8 -> CULong
+word8_to_culong = fromIntegral
+
+word8_to_cullong:: Word8 -> CULLong
+word8_to_cullong = fromIntegral
+
+word8_to_cschar:: Word8 -> CSChar
+word8_to_cschar = fromIntegral
+
+word8_to_cshort:: Word8 -> CShort
+word8_to_cshort = fromIntegral
+
+word8_to_cint:: Word8 -> CInt
+word8_to_cint = fromIntegral
+
+word8_to_clong:: Word8 -> CLong
+word8_to_clong = fromIntegral
+
+word8_to_cllong:: Word8 -> CLLong
+word8_to_cllong = fromIntegral
+
+int64_to_word64:: Int64 -> Word64
+int64_to_word64 = fromIntegral
+
+int64_to_word32:: Int64 -> Word32
+int64_to_word32 = fromIntegral
+
+int64_to_word16:: Int64 -> Word16
+int64_to_word16 = fromIntegral
+
+int64_to_word8:: Int64 -> Word8
+int64_to_word8 = fromIntegral
+
+int64_to_int64:: Int64 -> Int64
+int64_to_int64 = fromIntegral
+
+int64_to_int32:: Int64 -> Int32
+int64_to_int32 = fromIntegral
+
+int64_to_int16:: Int64 -> Int16
+int64_to_int16 = fromIntegral
+
+int64_to_int8:: Int64 -> Int8
+int64_to_int8 = fromIntegral
+
+int64_to_cchar:: Int64 -> CChar
+int64_to_cchar = fromIntegral
+
+int64_to_cushort:: Int64 -> CUShort
+int64_to_cushort = fromIntegral
+
+int64_to_cuint:: Int64 -> CUInt
+int64_to_cuint = fromIntegral
+
+int64_to_culong:: Int64 -> CULong
+int64_to_culong = fromIntegral
+
+int64_to_cullong:: Int64 -> CULLong
+int64_to_cullong = fromIntegral
+
+int64_to_cschar:: Int64 -> CSChar
+int64_to_cschar = fromIntegral
+
+int64_to_cshort:: Int64 -> CShort
+int64_to_cshort = fromIntegral
+
+int64_to_cint:: Int64 -> CInt
+int64_to_cint = fromIntegral
+
+int64_to_clong:: Int64 -> CLong
+int64_to_clong = fromIntegral
+
+int64_to_cllong:: Int64 -> CLLong
+int64_to_cllong = fromIntegral
+
+int32_to_word64:: Int32 -> Word64
+int32_to_word64 = fromIntegral
+
+int32_to_word32:: Int32 -> Word32
+int32_to_word32 = fromIntegral
+
+int32_to_word16:: Int32 -> Word16
+int32_to_word16 = fromIntegral
+
+int32_to_word8:: Int32 -> Word8
+int32_to_word8 = fromIntegral
+
+int32_to_int64:: Int32 -> Int64
+int32_to_int64 = fromIntegral
+
+int32_to_int32:: Int32 -> Int32
+int32_to_int32 = fromIntegral
+
+int32_to_int16:: Int32 -> Int16
+int32_to_int16 = fromIntegral
+
+int32_to_int8:: Int32 -> Int8
+int32_to_int8 = fromIntegral
+
+int32_to_cchar:: Int32 -> CChar
+int32_to_cchar = fromIntegral
+
+int32_to_cushort:: Int32 -> CUShort
+int32_to_cushort = fromIntegral
+
+int32_to_cuint:: Int32 -> CUInt
+int32_to_cuint = fromIntegral
+
+int32_to_culong:: Int32 -> CULong
+int32_to_culong = fromIntegral
+
+int32_to_cullong:: Int32 -> CULLong
+int32_to_cullong = fromIntegral
+
+int32_to_cschar:: Int32 -> CSChar
+int32_to_cschar = fromIntegral
+
+int32_to_cshort:: Int32 -> CShort
+int32_to_cshort = fromIntegral
+
+int32_to_cint:: Int32 -> CInt
+int32_to_cint = fromIntegral
+
+int32_to_clong:: Int32 -> CLong
+int32_to_clong = fromIntegral
+
+int32_to_cllong:: Int32 -> CLLong
+int32_to_cllong = fromIntegral
+
+int16_to_word64:: Int16 -> Word64
+int16_to_word64 = fromIntegral
+
+int16_to_word32:: Int16 -> Word32
+int16_to_word32 = fromIntegral
+
+int16_to_word16:: Int16 -> Word16
+int16_to_word16 = fromIntegral
+
+int16_to_word8:: Int16 -> Word8
+int16_to_word8 = fromIntegral
+
+int16_to_int64:: Int16 -> Int64
+int16_to_int64 = fromIntegral
+
+int16_to_int32:: Int16 -> Int32
+int16_to_int32 = fromIntegral
+
+int16_to_int16:: Int16 -> Int16
+int16_to_int16 = fromIntegral
+
+int16_to_int8:: Int16 -> Int8
+int16_to_int8 = fromIntegral
+
+int16_to_cchar:: Int16 -> CChar
+int16_to_cchar = fromIntegral
+
+int16_to_cushort:: Int16 -> CUShort
+int16_to_cushort = fromIntegral
+
+int16_to_cuint:: Int16 -> CUInt
+int16_to_cuint = fromIntegral
+
+int16_to_culong:: Int16 -> CULong
+int16_to_culong = fromIntegral
+
+int16_to_cullong:: Int16 -> CULLong
+int16_to_cullong = fromIntegral
+
+int16_to_cschar:: Int16 -> CSChar
+int16_to_cschar = fromIntegral
+
+int16_to_cshort:: Int16 -> CShort
+int16_to_cshort = fromIntegral
+
+int16_to_cint:: Int16 -> CInt
+int16_to_cint = fromIntegral
+
+int16_to_clong:: Int16 -> CLong
+int16_to_clong = fromIntegral
+
+int16_to_cllong:: Int16 -> CLLong
+int16_to_cllong = fromIntegral
+
+int8_to_word64:: Int8 -> Word64
+int8_to_word64 = fromIntegral
+
+int8_to_word32:: Int8 -> Word32
+int8_to_word32 = fromIntegral
+
+int8_to_word16:: Int8 -> Word16
+int8_to_word16 = fromIntegral
+
+int8_to_word8:: Int8 -> Word8
+int8_to_word8 = fromIntegral
+
+int8_to_int64:: Int8 -> Int64
+int8_to_int64 = fromIntegral
+
+int8_to_int32:: Int8 -> Int32
+int8_to_int32 = fromIntegral
+
+int8_to_int16:: Int8 -> Int16
+int8_to_int16 = fromIntegral
+
+int8_to_int8:: Int8 -> Int8
+int8_to_int8 = fromIntegral
+
+int8_to_cchar:: Int8 -> CChar
+int8_to_cchar = fromIntegral
+
+int8_to_cushort:: Int8 -> CUShort
+int8_to_cushort = fromIntegral
+
+int8_to_cuint:: Int8 -> CUInt
+int8_to_cuint = fromIntegral
+
+int8_to_culong:: Int8 -> CULong
+int8_to_culong = fromIntegral
+
+int8_to_cullong:: Int8 -> CULLong
+int8_to_cullong = fromIntegral
+
+int8_to_cschar:: Int8 -> CSChar
+int8_to_cschar = fromIntegral
+
+int8_to_cshort:: Int8 -> CShort
+int8_to_cshort = fromIntegral
+
+int8_to_cint:: Int8 -> CInt
+int8_to_cint = fromIntegral
+
+int8_to_clong:: Int8 -> CLong
+int8_to_clong = fromIntegral
+
+int8_to_cllong:: Int8 -> CLLong
+int8_to_cllong = fromIntegral
+
+cchar_to_word64:: CChar -> Word64
+cchar_to_word64 = fromIntegral
+
+cchar_to_word32:: CChar -> Word32
+cchar_to_word32 = fromIntegral
+
+cchar_to_word16:: CChar -> Word16
+cchar_to_word16 = fromIntegral
+
+cchar_to_word8:: CChar -> Word8
+cchar_to_word8 = fromIntegral
+
+cchar_to_int64:: CChar -> Int64
+cchar_to_int64 = fromIntegral
+
+cchar_to_int32:: CChar -> Int32
+cchar_to_int32 = fromIntegral
+
+cchar_to_int16:: CChar -> Int16
+cchar_to_int16 = fromIntegral
+
+cchar_to_int8:: CChar -> Int8
+cchar_to_int8 = fromIntegral
+
+cchar_to_cchar:: CChar -> CChar
+cchar_to_cchar = fromIntegral
+
+cchar_to_cushort:: CChar -> CUShort
+cchar_to_cushort = fromIntegral
+
+cchar_to_cuint:: CChar -> CUInt
+cchar_to_cuint = fromIntegral
+
+cchar_to_culong:: CChar -> CULong
+cchar_to_culong = fromIntegral
+
+cchar_to_cullong:: CChar -> CULLong
+cchar_to_cullong = fromIntegral
+
+cchar_to_cschar:: CChar -> CSChar
+cchar_to_cschar = fromIntegral
+
+cchar_to_cshort:: CChar -> CShort
+cchar_to_cshort = fromIntegral
+
+cchar_to_cint:: CChar -> CInt
+cchar_to_cint = fromIntegral
+
+cchar_to_clong:: CChar -> CLong
+cchar_to_clong = fromIntegral
+
+cchar_to_cllong:: CChar -> CLLong
+cchar_to_cllong = fromIntegral
+
+cushort_to_word64:: CUShort -> Word64
+cushort_to_word64 = fromIntegral
+
+cushort_to_word32:: CUShort -> Word32
+cushort_to_word32 = fromIntegral
+
+cushort_to_word16:: CUShort -> Word16
+cushort_to_word16 = fromIntegral
+
+cushort_to_word8:: CUShort -> Word8
+cushort_to_word8 = fromIntegral
+
+cushort_to_int64:: CUShort -> Int64
+cushort_to_int64 = fromIntegral
+
+cushort_to_int32:: CUShort -> Int32
+cushort_to_int32 = fromIntegral
+
+cushort_to_int16:: CUShort -> Int16
+cushort_to_int16 = fromIntegral
+
+cushort_to_int8:: CUShort -> Int8
+cushort_to_int8 = fromIntegral
+
+cushort_to_cchar:: CUShort -> CChar
+cushort_to_cchar = fromIntegral
+
+cushort_to_cushort:: CUShort -> CUShort
+cushort_to_cushort = fromIntegral
+
+cushort_to_cuint:: CUShort -> CUInt
+cushort_to_cuint = fromIntegral
+
+cushort_to_culong:: CUShort -> CULong
+cushort_to_culong = fromIntegral
+
+cushort_to_cullong:: CUShort -> CULLong
+cushort_to_cullong = fromIntegral
+
+cushort_to_cschar:: CUShort -> CSChar
+cushort_to_cschar = fromIntegral
+
+cushort_to_cshort:: CUShort -> CShort
+cushort_to_cshort = fromIntegral
+
+cushort_to_cint:: CUShort -> CInt
+cushort_to_cint = fromIntegral
+
+cushort_to_clong:: CUShort -> CLong
+cushort_to_clong = fromIntegral
+
+cushort_to_cllong:: CUShort -> CLLong
+cushort_to_cllong = fromIntegral
+
+cuint_to_word64:: CUInt -> Word64
+cuint_to_word64 = fromIntegral
+
+cuint_to_word32:: CUInt -> Word32
+cuint_to_word32 = fromIntegral
+
+cuint_to_word16:: CUInt -> Word16
+cuint_to_word16 = fromIntegral
+
+cuint_to_word8:: CUInt -> Word8
+cuint_to_word8 = fromIntegral
+
+cuint_to_int64:: CUInt -> Int64
+cuint_to_int64 = fromIntegral
+
+cuint_to_int32:: CUInt -> Int32
+cuint_to_int32 = fromIntegral
+
+cuint_to_int16:: CUInt -> Int16
+cuint_to_int16 = fromIntegral
+
+cuint_to_int8:: CUInt -> Int8
+cuint_to_int8 = fromIntegral
+
+cuint_to_cchar:: CUInt -> CChar
+cuint_to_cchar = fromIntegral
+
+cuint_to_cushort:: CUInt -> CUShort
+cuint_to_cushort = fromIntegral
+
+cuint_to_cuint:: CUInt -> CUInt
+cuint_to_cuint = fromIntegral
+
+cuint_to_culong:: CUInt -> CULong
+cuint_to_culong = fromIntegral
+
+cuint_to_cullong:: CUInt -> CULLong
+cuint_to_cullong = fromIntegral
+
+cuint_to_cschar:: CUInt -> CSChar
+cuint_to_cschar = fromIntegral
+
+cuint_to_cshort:: CUInt -> CShort
+cuint_to_cshort = fromIntegral
+
+cuint_to_cint:: CUInt -> CInt
+cuint_to_cint = fromIntegral
+
+cuint_to_clong:: CUInt -> CLong
+cuint_to_clong = fromIntegral
+
+cuint_to_cllong:: CUInt -> CLLong
+cuint_to_cllong = fromIntegral
+
+culong_to_word64:: CULong -> Word64
+culong_to_word64 = fromIntegral
+
+culong_to_word32:: CULong -> Word32
+culong_to_word32 = fromIntegral
+
+culong_to_word16:: CULong -> Word16
+culong_to_word16 = fromIntegral
+
+culong_to_word8:: CULong -> Word8
+culong_to_word8 = fromIntegral
+
+culong_to_int64:: CULong -> Int64
+culong_to_int64 = fromIntegral
+
+culong_to_int32:: CULong -> Int32
+culong_to_int32 = fromIntegral
+
+culong_to_int16:: CULong -> Int16
+culong_to_int16 = fromIntegral
+
+culong_to_int8:: CULong -> Int8
+culong_to_int8 = fromIntegral
+
+culong_to_cchar:: CULong -> CChar
+culong_to_cchar = fromIntegral
+
+culong_to_cushort:: CULong -> CUShort
+culong_to_cushort = fromIntegral
+
+culong_to_cuint:: CULong -> CUInt
+culong_to_cuint = fromIntegral
+
+culong_to_culong:: CULong -> CULong
+culong_to_culong = fromIntegral
+
+culong_to_cullong:: CULong -> CULLong
+culong_to_cullong = fromIntegral
+
+culong_to_cschar:: CULong -> CSChar
+culong_to_cschar = fromIntegral
+
+culong_to_cshort:: CULong -> CShort
+culong_to_cshort = fromIntegral
+
+culong_to_cint:: CULong -> CInt
+culong_to_cint = fromIntegral
+
+culong_to_clong:: CULong -> CLong
+culong_to_clong = fromIntegral
+
+culong_to_cllong:: CULong -> CLLong
+culong_to_cllong = fromIntegral
+
+cullong_to_word64:: CULLong -> Word64
+cullong_to_word64 = fromIntegral
+
+cullong_to_word32:: CULLong -> Word32
+cullong_to_word32 = fromIntegral
+
+cullong_to_word16:: CULLong -> Word16
+cullong_to_word16 = fromIntegral
+
+cullong_to_word8:: CULLong -> Word8
+cullong_to_word8 = fromIntegral
+
+cullong_to_int64:: CULLong -> Int64
+cullong_to_int64 = fromIntegral
+
+cullong_to_int32:: CULLong -> Int32
+cullong_to_int32 = fromIntegral
+
+cullong_to_int16:: CULLong -> Int16
+cullong_to_int16 = fromIntegral
+
+cullong_to_int8:: CULLong -> Int8
+cullong_to_int8 = fromIntegral
+
+cullong_to_cchar:: CULLong -> CChar
+cullong_to_cchar = fromIntegral
+
+cullong_to_cushort:: CULLong -> CUShort
+cullong_to_cushort = fromIntegral
+
+cullong_to_cuint:: CULLong -> CUInt
+cullong_to_cuint = fromIntegral
+
+cullong_to_culong:: CULLong -> CULong
+cullong_to_culong = fromIntegral
+
+cullong_to_cullong:: CULLong -> CULLong
+cullong_to_cullong = fromIntegral
+
+cullong_to_cschar:: CULLong -> CSChar
+cullong_to_cschar = fromIntegral
+
+cullong_to_cshort:: CULLong -> CShort
+cullong_to_cshort = fromIntegral
+
+cullong_to_cint:: CULLong -> CInt
+cullong_to_cint = fromIntegral
+
+cullong_to_clong:: CULLong -> CLong
+cullong_to_clong = fromIntegral
+
+cullong_to_cllong:: CULLong -> CLLong
+cullong_to_cllong = fromIntegral
+
+cschar_to_word64:: CSChar -> Word64
+cschar_to_word64 = fromIntegral
+
+cschar_to_word32:: CSChar -> Word32
+cschar_to_word32 = fromIntegral
+
+cschar_to_word16:: CSChar -> Word16
+cschar_to_word16 = fromIntegral
+
+cschar_to_word8:: CSChar -> Word8
+cschar_to_word8 = fromIntegral
+
+cschar_to_int64:: CSChar -> Int64
+cschar_to_int64 = fromIntegral
+
+cschar_to_int32:: CSChar -> Int32
+cschar_to_int32 = fromIntegral
+
+cschar_to_int16:: CSChar -> Int16
+cschar_to_int16 = fromIntegral
+
+cschar_to_int8:: CSChar -> Int8
+cschar_to_int8 = fromIntegral
+
+cschar_to_cchar:: CSChar -> CChar
+cschar_to_cchar = fromIntegral
+
+cschar_to_cushort:: CSChar -> CUShort
+cschar_to_cushort = fromIntegral
+
+cschar_to_cuint:: CSChar -> CUInt
+cschar_to_cuint = fromIntegral
+
+cschar_to_culong:: CSChar -> CULong
+cschar_to_culong = fromIntegral
+
+cschar_to_cullong:: CSChar -> CULLong
+cschar_to_cullong = fromIntegral
+
+cschar_to_cschar:: CSChar -> CSChar
+cschar_to_cschar = fromIntegral
+
+cschar_to_cshort:: CSChar -> CShort
+cschar_to_cshort = fromIntegral
+
+cschar_to_cint:: CSChar -> CInt
+cschar_to_cint = fromIntegral
+
+cschar_to_clong:: CSChar -> CLong
+cschar_to_clong = fromIntegral
+
+cschar_to_cllong:: CSChar -> CLLong
+cschar_to_cllong = fromIntegral
+
+cshort_to_word64:: CShort -> Word64
+cshort_to_word64 = fromIntegral
+
+cshort_to_word32:: CShort -> Word32
+cshort_to_word32 = fromIntegral
+
+cshort_to_word16:: CShort -> Word16
+cshort_to_word16 = fromIntegral
+
+cshort_to_word8:: CShort -> Word8
+cshort_to_word8 = fromIntegral
+
+cshort_to_int64:: CShort -> Int64
+cshort_to_int64 = fromIntegral
+
+cshort_to_int32:: CShort -> Int32
+cshort_to_int32 = fromIntegral
+
+cshort_to_int16:: CShort -> Int16
+cshort_to_int16 = fromIntegral
+
+cshort_to_int8:: CShort -> Int8
+cshort_to_int8 = fromIntegral
+
+cshort_to_cchar:: CShort -> CChar
+cshort_to_cchar = fromIntegral
+
+cshort_to_cushort:: CShort -> CUShort
+cshort_to_cushort = fromIntegral
+
+cshort_to_cuint:: CShort -> CUInt
+cshort_to_cuint = fromIntegral
+
+cshort_to_culong:: CShort -> CULong
+cshort_to_culong = fromIntegral
+
+cshort_to_cullong:: CShort -> CULLong
+cshort_to_cullong = fromIntegral
+
+cshort_to_cschar:: CShort -> CSChar
+cshort_to_cschar = fromIntegral
+
+cshort_to_cshort:: CShort -> CShort
+cshort_to_cshort = fromIntegral
+
+cshort_to_cint:: CShort -> CInt
+cshort_to_cint = fromIntegral
+
+cshort_to_clong:: CShort -> CLong
+cshort_to_clong = fromIntegral
+
+cshort_to_cllong:: CShort -> CLLong
+cshort_to_cllong = fromIntegral
+
+cint_to_word64:: CInt -> Word64
+cint_to_word64 = fromIntegral
+
+cint_to_word32:: CInt -> Word32
+cint_to_word32 = fromIntegral
+
+cint_to_word16:: CInt -> Word16
+cint_to_word16 = fromIntegral
+
+cint_to_word8:: CInt -> Word8
+cint_to_word8 = fromIntegral
+
+cint_to_int64:: CInt -> Int64
+cint_to_int64 = fromIntegral
+
+cint_to_int32:: CInt -> Int32
+cint_to_int32 = fromIntegral
+
+cint_to_int16:: CInt -> Int16
+cint_to_int16 = fromIntegral
+
+cint_to_int8:: CInt -> Int8
+cint_to_int8 = fromIntegral
+
+cint_to_cchar:: CInt -> CChar
+cint_to_cchar = fromIntegral
+
+cint_to_cushort:: CInt -> CUShort
+cint_to_cushort = fromIntegral
+
+cint_to_cuint:: CInt -> CUInt
+cint_to_cuint = fromIntegral
+
+cint_to_culong:: CInt -> CULong
+cint_to_culong = fromIntegral
+
+cint_to_cullong:: CInt -> CULLong
+cint_to_cullong = fromIntegral
+
+cint_to_cschar:: CInt -> CSChar
+cint_to_cschar = fromIntegral
+
+cint_to_cshort:: CInt -> CShort
+cint_to_cshort = fromIntegral
+
+cint_to_cint:: CInt -> CInt
+cint_to_cint = fromIntegral
+
+cint_to_clong:: CInt -> CLong
+cint_to_clong = fromIntegral
+
+cint_to_cllong:: CInt -> CLLong
+cint_to_cllong = fromIntegral
+
+clong_to_word64:: CLong -> Word64
+clong_to_word64 = fromIntegral
+
+clong_to_word32:: CLong -> Word32
+clong_to_word32 = fromIntegral
+
+clong_to_word16:: CLong -> Word16
+clong_to_word16 = fromIntegral
+
+clong_to_word8:: CLong -> Word8
+clong_to_word8 = fromIntegral
+
+clong_to_int64:: CLong -> Int64
+clong_to_int64 = fromIntegral
+
+clong_to_int32:: CLong -> Int32
+clong_to_int32 = fromIntegral
+
+clong_to_int16:: CLong -> Int16
+clong_to_int16 = fromIntegral
+
+clong_to_int8:: CLong -> Int8
+clong_to_int8 = fromIntegral
+
+clong_to_cchar:: CLong -> CChar
+clong_to_cchar = fromIntegral
+
+clong_to_cushort:: CLong -> CUShort
+clong_to_cushort = fromIntegral
+
+clong_to_cuint:: CLong -> CUInt
+clong_to_cuint = fromIntegral
+
+clong_to_culong:: CLong -> CULong
+clong_to_culong = fromIntegral
+
+clong_to_cullong:: CLong -> CULLong
+clong_to_cullong = fromIntegral
+
+clong_to_cschar:: CLong -> CSChar
+clong_to_cschar = fromIntegral
+
+clong_to_cshort:: CLong -> CShort
+clong_to_cshort = fromIntegral
+
+clong_to_cint:: CLong -> CInt
+clong_to_cint = fromIntegral
+
+clong_to_clong:: CLong -> CLong
+clong_to_clong = fromIntegral
+
+clong_to_cllong:: CLong -> CLLong
+clong_to_cllong = fromIntegral
+
+cllong_to_word64:: CLLong -> Word64
+cllong_to_word64 = fromIntegral
+
+cllong_to_word32:: CLLong -> Word32
+cllong_to_word32 = fromIntegral
+
+cllong_to_word16:: CLLong -> Word16
+cllong_to_word16 = fromIntegral
+
+cllong_to_word8:: CLLong -> Word8
+cllong_to_word8 = fromIntegral
+
+cllong_to_int64:: CLLong -> Int64
+cllong_to_int64 = fromIntegral
+
+cllong_to_int32:: CLLong -> Int32
+cllong_to_int32 = fromIntegral
+
+cllong_to_int16:: CLLong -> Int16
+cllong_to_int16 = fromIntegral
+
+cllong_to_int8:: CLLong -> Int8
+cllong_to_int8 = fromIntegral
+
+cllong_to_cchar:: CLLong -> CChar
+cllong_to_cchar = fromIntegral
+
+cllong_to_cushort:: CLLong -> CUShort
+cllong_to_cushort = fromIntegral
+
+cllong_to_cuint:: CLLong -> CUInt
+cllong_to_cuint = fromIntegral
+
+cllong_to_culong:: CLLong -> CULong
+cllong_to_culong = fromIntegral
+
+cllong_to_cullong:: CLLong -> CULLong
+cllong_to_cullong = fromIntegral
+
+cllong_to_cschar:: CLLong -> CSChar
+cllong_to_cschar = fromIntegral
+
+cllong_to_cshort:: CLLong -> CShort
+cllong_to_cshort = fromIntegral
+
+cllong_to_cint:: CLLong -> CInt
+cllong_to_cint = fromIntegral
+
+cllong_to_clong:: CLLong -> CLong
+cllong_to_clong = fromIntegral
+
+cllong_to_cllong:: CLLong -> CLLong
+cllong_to_cllong = fromIntegral
+
diff --git a/testsuite/tests/numeric/should_compile/all.T b/testsuite/tests/numeric/should_compile/all.T
index 766dda4814..425d0dbd85 100644
--- a/testsuite/tests/numeric/should_compile/all.T
+++ b/testsuite/tests/numeric/should_compile/all.T
@@ -10,3 +10,4 @@ test('T8542', omit_ways(['hpc']), compile, [''])
test('T10929', normal, compile, [''])
test('T16402', [ grep_errmsg(r'and'), when(wordsize(32), expect_broken(19024)) ], compile, [''])
test('T19892', normal, compile, ['-O -ddump-rule-firings'])
+test('T20062', [ grep_errmsg(r'integer') ], compile, ['-ddump-simpl -O -dsuppress-all'])