From fb02349ca1daf3eaedeff076bf7cedb5923b82f7 Mon Sep 17 00:00:00 2001 From: "simonpj@microsoft.com" Date: Tue, 20 Oct 2009 07:26:16 +0000 Subject: [PATCH] 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. --- compiler/hsSyn/Convert.lhs | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) 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 } -- 1.7.10.4