Fixes #12504: Double-escape paths used to build call to hsc_line
authorRichard Cook <rcook@rcook.org>
Mon, 22 Aug 2016 19:14:17 +0000 (12:14 -0700)
committerBen Gamari <ben@smart-cactus.org>
Tue, 30 Aug 2016 21:04:33 +0000 (17:04 -0400)
In outHsLine, paths passed to construct invocations of hsc_line must be escaped
twice in order to generate a properly escaped string literal that will end up
in the eventual LINE pragma emitted by this code. This is especially important
on Windows paths, where backslashes would otherwise be treated as C escape
sequences and result in the incorrect Windows paths.

See https://ghc.haskell.org/trac/ghc/ticket/12504

C.hs

diff --git a/C.hs b/C.hs
index dd02f43..f742be7 100644 (file)
--- a/C.hs
+++ b/C.hs
@@ -185,7 +185,7 @@ outCLine (SourcePos name line) =
 outHsLine :: SourcePos -> String
 outHsLine (SourcePos name line) =
     "    hsc_line ("++show (line + 1)++", \""++
-    showCString name++"\");\n"
+    (showCString . showCString) name ++ "\");\n"
 
 showCString :: String -> String
 showCString = concatMap showCChar