Decode escape sequences properly in line pragmas (see comment for details).
authorSimon Marlow <marlowsd@gmail.com>
Wed, 23 Nov 2011 16:13:59 +0000 (16:13 +0000)
committerSimon Marlow <marlowsd@gmail.com>
Wed, 23 Nov 2011 16:19:23 +0000 (16:19 +0000)
compiler/parser/Lexer.x

index 17d3e90..1486b64 100644 (file)
@@ -1126,7 +1126,19 @@ setLine code span buf len = do
 
 setFile :: Int -> Action
 setFile code span buf len = do
-  let file = lexemeToFastString (stepOn buf) (len-2)
+  let file = mkFastString (go (lexemeToString (stepOn buf) (len-2)))
+        where go ('\\':c:cs) = c : go cs
+              go (c:cs)      = c : go cs
+              go []          = []
+              -- decode escapes in the filename.  e.g. on Windows
+              -- when our filenames have backslashes in, gcc seems to
+              -- escape the backslashes.  One symptom of not doing this
+              -- is that filenames in error messages look a bit strange:
+              --   C:\\foo\bar.hs
+              -- only the first backslash is doubled, because we apply
+              -- System.FilePath.normalise before printing out
+              -- filenames and it does not remove duplicate
+              -- backslashes after the drive letter (should it?).
   setAlrLastLoc $ alrInitialLoc file
   setSrcLoc (mkRealSrcLoc file (srcSpanEndLine span) (srcSpanEndCol span))
   addSrcFile file