diff --git a/file-modules.cabal b/file-modules.cabal
--- a/file-modules.cabal
+++ b/file-modules.cabal
@@ -1,5 +1,5 @@
 name: file-modules
-version: 0.1.2.2
+version: 0.1.2.3
 cabal-version: >=1.10
 build-type: Simple
 license: MIT
@@ -18,25 +18,29 @@
     exposed-modules:
         Development.FileModules
     build-depends:
-        MissingH -any,
-        directory -any,
-        async -any,
-        base >=4.5 && <5,
-        filepath -any,
-        haskell-src-exts >=1.17 && <2
+                  MissingH -any,
+                  async -any,
+                  base >=4.5 && <5,
+                  directory -any,
+                  filepath -any,
+                  haskell-src-exts >=1.17 && <2,
+                  regex-compat >= 0.95.1,
+                  regex-pcre
     default-language: Haskell2010
     hs-source-dirs: src
 
 executable file-modules
     main-is: Main.hs
     build-depends:
-        base >=4.5 && <5,
-        MissingH -any,
-        directory -any,
-        async -any,
-        base >=4.5 && <5,
-        filepath -any,
-        haskell-src-exts >=1.17 && <2
+                  MissingH -any,
+                  async -any,
+                  base >=4.5 && <5,
+                  base >=4.5 && <5,
+                  directory -any,
+                  filepath -any,
+                  haskell-src-exts >=1.17 && <2,
+                  regex-compat >= 0.95.1,
+                  regex-pcre -any
     default-language: Haskell2010
     hs-source-dirs: src
     ghc-options: -O2 -threaded
diff --git a/src/Development/FileModules.hs b/src/Development/FileModules.hs
--- a/src/Development/FileModules.hs
+++ b/src/Development/FileModules.hs
@@ -7,9 +7,10 @@
 import           Language.Haskell.Exts    (ImportDecl (..),
                                            ModuleHeadAndImports (..),
                                            ModuleName (..), NonGreedy (..),
-                                           ParseResult (..), parse)
+                                           ParseResult (..), SrcLoc (..), parse)
 import           System.Directory
 import           System.FilePath
+import           Text.Regex
 
 fileModulesRecur :: FilePath -> IO [String]
 fileModulesRecur fname = run fname
@@ -28,15 +29,30 @@
 
 fileModules :: FilePath -> IO [String]
 fileModules fname = do
-    result <- parse . sanitize <$> readFile fname
-    case result of
-        (ParseOk (NonGreedy{..})) -> do
+    fcontents <- readFile fname
+    case parse $ sanitize fcontents  of
+        (ParseOk NonGreedy{..}) -> do
             let (ModuleHeadAndImports _ _ mimports) = unNonGreedy
             forM mimports $ \imp ->
                 let ModuleName iname = importModule imp
                 in return iname
-        (ParseFailed _ _) -> error $ "Failed to parse module in " ++ fname
+        (ParseFailed (SrcLoc _ line col) err) -> error $
+            "Failed to parse module in " ++ fname ++ ":\n" ++
+            "  (" ++ show line ++ ":" ++ show col ++ ") " ++ err ++ "\n" ++
+            "  " ++ getLineCol fcontents (line, col)
   where
-    sanitize = unlines . map removeCpp . lines
+    sanitize =
+        unlines . map (removeMagicHash . removeCpp) . lines
     removeCpp ('#':_) = ""
     removeCpp l = l
+    removeMagicHash l = subRegex r l o
+      where
+        r = mkRegex "#"
+        o = ""
+    getLineCol fcontents (line, col) =
+        ln ++ "\n" ++
+        "  " ++ replicate (col' - 3) ' ' ++ "^^^"
+      where
+        ln = lines fcontents !! line
+        col' = let l = length ln
+               in if col > l then l else col
