Fix Trac #3600: Template Haskell bug in Convert
authorsimonpj@microsoft.com <unknown>
Tue, 20 Oct 2009 07:26:16 +0000 (07:26 +0000)
committersimonpj@microsoft.com <unknown>
Tue, 20 Oct 2009 07:26:16 +0000 (07:26 +0000)
This bug was introduced when I added an optimisation, described in
Note [Converting strings] in Convert.lhs.  It was treating *all*
empty lists as strings, not just string-typed ones!

The fix is easy.  Pls MERGE to stable branch.

compiler/hsSyn/Convert.lhs

index b87c18c..56ec2d7 100644 (file)
@@ -568,10 +568,16 @@ if it isn't a literal string
 
 allCharLs :: [TH.Exp] -> Maybe String
 -- Note [Converting strings]
-allCharLs (LitE (CharL c) : xs) 
-  | Just cs <- allCharLs xs = Just (c:cs)
-allCharLs [] = Just []
-allCharLs _  = Nothing
+-- NB: only fire up this setup for a non-empty list, else
+--     there's a danger of returning "" for [] :: [Int]!
+allCharLs xs
+  = case xs of 
+      LitE (CharL c) : ys -> go [c] ys
+      _                   -> Nothing
+  where
+    go cs []                    = Just (reverse cs)
+    go cs (LitE (CharL c) : ys) = go (c:cs) ys
+    go _  _                     = Nothing
 
 cvtLit :: Lit -> CvtM HsLit
 cvtLit (IntPrimL i)    = do { force i; return $ HsIntPrim i }