Driver: `ghci -e` should behave like `ghc -e` (#9360)
authorThomas Miedema <thomasmiedema@gmail.com>
Sat, 17 Oct 2015 10:15:32 +0000 (12:15 +0200)
committerThomas Miedema <thomasmiedema@gmail.com>
Mon, 19 Oct 2015 15:58:24 +0000 (17:58 +0200)
Patch by lukyanov.

Reviewed by: bgamari

Differential Revision: https://phabricator.haskell.org/D1337

docs/users_guide/7.12.1-notes.rst
ghc/Main.hs
testsuite/tests/driver/all.T

index 05ab2e2..e05366c 100644 (file)
@@ -108,14 +108,16 @@ GHCi
 -  ``Main`` with an explicit module header but without ``main`` is now
    an error (#7765).
 
-   The ``:back`` and ``:forward`` commands now take an optional count
+-  The ``:back`` and ``:forward`` commands now take an optional count
    allowing the user to move forward or backward in history several
    steps at a time.
 
-   Added commands ``:load!`` and ``:reload!``, effectively setting
+-  Added commands ``:load!`` and ``:reload!``, effectively setting
    "-fdefer-type-errors" before loading a module and unsetting it after
    loading if it has not been set before (#8353).
 
+-  ``ghci -e`` now behaves like ``ghc -e`` (#9360).
+
 Template Haskell
 ~~~~~~~~~~~~~~~~
 
index 4ef44f2..fc6ab88 100644 (file)
@@ -492,6 +492,10 @@ isDoMakeMode :: Mode -> Bool
 isDoMakeMode (Right (Right DoMake)) = True
 isDoMakeMode _ = False
 
+isDoEvalMode :: Mode -> Bool
+isDoEvalMode (Right (Right (DoEval _))) = True
+isDoEvalMode _ = False
+
 #ifdef GHCI
 isInteractiveMode :: PostLoadMode -> Bool
 isInteractiveMode DoInteractive = True
@@ -629,6 +633,15 @@ setMode newMode newFlag = liftEwM $ do
                       | isShowGhcUsageMode newMode &&
                         isDoInteractiveMode oldMode ->
                             ((showGhciUsageMode, newFlag), [])
+
+                    -- If we have both -e and --interactive then -e always wins
+                    _ | isDoEvalMode oldMode &&
+                        isDoInteractiveMode newMode ->
+                            ((oldMode, oldFlag), [])
+                      | isDoEvalMode newMode &&
+                        isDoInteractiveMode oldMode ->
+                            ((newMode, newFlag), [])
+
                     -- Otherwise, --help/--version/--numeric-version always win
                       | isDominantFlag oldMode -> ((oldMode, oldFlag), [])
                       | isDominantFlag newMode -> ((newMode, newFlag), [])
index 17e0784..08fdc1f 100644 (file)
@@ -453,3 +453,6 @@ test('T365',
       unless(opsys('mingw32'), skip)],
       compile_fail,
       [''])
+
+test('T9360a', normal, run_command, ['{compiler} --interactive -e ""'])
+test('T9360b', normal, run_command, ['{compiler} -e "" --interactive'])