summaryrefslogtreecommitdiff
path: root/ghc
diff options
context:
space:
mode:
authorFlaviu Andrei Csernik (archblob) <fcsernik@gmail.com>2015-06-01 02:13:36 -0500
committerAustin Seipp <austin@well-typed.com>2015-06-01 02:13:36 -0500
commit4756438962a76d2dcedf63b90ec789cb054f9556 (patch)
tree684cf8063cb78910c934f7729e59c34521853051 /ghc
parent94fff17963af2292504d02ead819bc4340878786 (diff)
downloadhaskell-4756438962a76d2dcedf63b90ec789cb054f9556.tar.gz
Catch canonicalizePath exceptions, fix #10101
Summary: Introduce by #95 'canonicalizePath' throws and exception when given an invalid file in a call to 'sameFile'. There are two cases when this can happen when using ghci: 1) If there is an error at the interactive prompt, "<interactive>" file is searched for and not found. 2) If there is an error in any loaded file and editing an inexistent/new file with 'e: foo'. Both cases are now tested. Test Plan: validate Reviewers: austin, #ghc Reviewed By: austin, #ghc Subscribers: bgamari, thomie Differential Revision: https://phabricator.haskell.org/D930 GHC Trac Issues: #10101
Diffstat (limited to 'ghc')
-rw-r--r--ghc/InteractiveUI.hs9
1 files changed, 3 insertions, 6 deletions
diff --git a/ghc/InteractiveUI.hs b/ghc/InteractiveUI.hs
index 0adc0cd521..d3b4368478 100644
--- a/ghc/InteractiveUI.hs
+++ b/ghc/InteractiveUI.hs
@@ -1245,6 +1245,9 @@ editFile str =
when (null cmd)
$ throwGhcException (CmdLineError "editor not set, use :set editor")
lineOpt <- liftIO $ do
+ let sameFile p1 p2 = liftA2 (==) (canonicalizePath p1) (canonicalizePath p2)
+ `catchIO` (\_ -> return False)
+
curFileErrs <- filterM (\(f, _) -> unpackFS f `sameFile` file) errs
return $ case curFileErrs of
(_, line):_ -> " +" ++ show line
@@ -3222,12 +3225,6 @@ expandPathIO p =
other ->
return other
-sameFile :: FilePath -> FilePath -> IO Bool
-sameFile path1 path2 = do
- absPath1 <- canonicalizePath path1
- absPath2 <- canonicalizePath path2
- return $ absPath1 == absPath2
-
wantInterpretedModule :: GHC.GhcMonad m => String -> m Module
wantInterpretedModule str = wantInterpretedModuleName (GHC.mkModuleName str)