From 4756438962a76d2dcedf63b90ec789cb054f9556 Mon Sep 17 00:00:00 2001 From: "Flaviu Andrei Csernik (archblob)" Date: Mon, 1 Jun 2015 02:13:36 -0500 Subject: 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, "" 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 --- ghc/InteractiveUI.hs | 9 +++------ testsuite/tests/ghci/prog013/prog013.script | 4 ++++ testsuite/tests/ghci/prog013/prog013.stderr | 14 +++++++++++--- testsuite/tests/ghci/prog013/prog013.stdout | 2 ++ 4 files changed, 20 insertions(+), 9 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) diff --git a/testsuite/tests/ghci/prog013/prog013.script b/testsuite/tests/ghci/prog013/prog013.script index d4b91deec1..f2e234384b 100644 --- a/testsuite/tests/ghci/prog013/prog013.script +++ b/testsuite/tests/ghci/prog013/prog013.script @@ -6,3 +6,7 @@ :e ./Bad.hs :l Good.hs :e ++ +:e foo +:l Bad.hs +:e bar diff --git a/testsuite/tests/ghci/prog013/prog013.stderr b/testsuite/tests/ghci/prog013/prog013.stderr index d8970d4d2e..ce8827f6ca 100644 --- a/testsuite/tests/ghci/prog013/prog013.stderr +++ b/testsuite/tests/ghci/prog013/prog013.stderr @@ -1,9 +1,17 @@ -Bad.hs:3:8: +Bad.hs:3:8: error: lexical error in string/character literal at character '\n' -Bad.hs:3:8: +Bad.hs:3:8: error: lexical error in string/character literal at character '\n' -Bad.hs:3:8: +Bad.hs:3:8: error: + lexical error in string/character literal at character '\n' + +:10:1: error: parse error on input ‘+’ + +Bad.hs:3:8: error: + lexical error in string/character literal at character '\n' + +Bad.hs:3:8: error: lexical error in string/character literal at character '\n' diff --git a/testsuite/tests/ghci/prog013/prog013.stdout b/testsuite/tests/ghci/prog013/prog013.stdout index 0d621dad77..024fd7905a 100644 --- a/testsuite/tests/ghci/prog013/prog013.stdout +++ b/testsuite/tests/ghci/prog013/prog013.stdout @@ -2,3 +2,5 @@ Good.hs Bad.hs +3 ./Bad.hs +3 Good.hs +foo +bar -- cgit v1.2.1