comipleExpr or :def in GHCi rejects valid multiline expr or accepts invalid expr
dynComipleExpr will accept invalid expr or reject valid expr because it compiles the expr as "let _dynComipleExpr = (" ++ expr ++ ")".
-- tail -n 15 Test.hs
forM_ exprs $ \expr ->
handleSourceError printException $ do
dyn <- dynCompileExpr expr
liftIO $ print dyn
where
exprs =
[ ""
, "(),()"
, "()"
, "\"test\""
, unlines [ "[()]"
, " :: [()]"
]
]
-- ./Test /lib/ghc
<<()>>
<<((),())>>
<<()>>
<<[Char]>>
<interactive>:2:2:
parse error (possibly incorrect indentation or mismatched brackets)
As :def and :cmd uses compileExpr, they have the same problem:
GHCi, version 7.10.1: http://www.haskell.org/ghc/ :? for help
Prelude> :{
Prelude| :cmd return $ unlines
Prelude| [ "1"
Prelude| , "2"
Prelude| ]
Prelude| :}
<interactive>:2:3:
parse error (possibly incorrect indentation or mismatched brackets)
Prelude> import Prelude (return, id, ShowS, IO)
Prelude> :cmd return "0"
<interactive>:1:42:
Not in scope: type constructor or class ‘String’
Prelude> type String = ShowS
Prelude> :cmd return id
zsh: segmentation fault (core dumped) ghci
Trac metadata
| Trac field | Value |
|---|---|
| Version | 7.10.1 |
| Type | Bug |
| TypeOfFailure | OtherFailure |
| Priority | normal |
| Resolution | Unresolved |
| Component | GHC API |
| Test case | |
| Differential revisions | |
| BlockedBy | |
| Related | |
| Blocking | |
| CC | simonmar |
| Operating system | |
| Architecture |