Fix big character literal printing in External Core
authorTim Chevalier <chevalier@alum.wellesley.edu>
Sat, 29 Mar 2008 22:11:09 +0000 (22:11 +0000)
committerTim Chevalier <chevalier@alum.wellesley.edu>
Sat, 29 Mar 2008 22:11:09 +0000 (22:11 +0000)
Characters bigger than '\xff' should be represented as int
literals in External Core. (This was originally fixed five years ago
and broken again four and a half years ago...)

compiler/coreSyn/MkExternalCore.lhs

index 244144c..3e8a989 100644 (file)
@@ -32,6 +32,8 @@ import StaticFlags
 import IO
 import FastString
 
+import Data.Char
+
 emitExternalCore :: DynFlags -> NameSet -> CgGuts -> IO ()
 emitExternalCore dflags exports cg_guts
  | opt_EmitExternalCore 
@@ -160,7 +162,12 @@ make_alt a@(DEFAULT,_ ,_) = pprPanic ("MkExternalCore: make_alt: DEFAULT "
 make_lit :: Literal -> C.Lit
 make_lit l = 
   case l of
-    MachChar i -> C.Lchar i t
+    -- Note that we need to check whether the character is "big".
+    -- External Core only allows character literals up to '\xff'.
+    MachChar i | i <= chr 0xff -> C.Lchar i t
+    -- For a character bigger than 0xff, we represent it in ext-core
+    -- as an int lit with a char type.
+    MachChar i             -> C.Lint (fromIntegral $ ord i) t 
     MachStr s -> C.Lstring (unpackFS s) t
     MachNullAddr -> C.Lint 0 t
     MachInt i -> C.Lint i t