From: simonpj@microsoft.com Date: Tue, 20 Oct 2009 07:26:16 +0000 (+0000) Subject: Fix Trac #3600: Template Haskell bug in Convert X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=commitdiff_plain;h=fb02349ca1daf3eaedeff076bf7cedb5923b82f7 Fix Trac #3600: Template Haskell bug in Convert 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. --- diff --git a/compiler/hsSyn/Convert.lhs b/compiler/hsSyn/Convert.lhs index b87c18c..56ec2d7 100644 --- a/compiler/hsSyn/Convert.lhs +++ b/compiler/hsSyn/Convert.lhs @@ -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 }