Bug in do expressions

Simon Peyton-Jones simonpj at microsoft.com
Thu Nov 21 04:12:58 EST 2002


Ah, indeed so.  Thank you for reporting this.   It turned out to be
caused by a function written like this
	f (C a) = ...
	f (D a b) = ...
	f other = False

The data type changed, and we should have added a new case to the
function, but the default case caught it, so there was no indication.
It just shows: don't use default cases! 

The good news is that I managed to fix it by eliminating 'f' altogether
(it was called 'failureFreePat' in fact).  So GHC is 30 lines shorter
thanks to you.   

Simon

| -----Original Message-----
| From: Andrew J Bromage [mailto:ajb at spamcop.net]
| Sent: 21 November 2002 00:45
| To: glasgow-haskell-bugs at haskell.org
| Subject: Bug in do expressions
| 
| G'day all.
| 
| In a recent GHC checkout, the following program:
| 
|     module Main(main) where
| 
|     import Maybe
|     import Control.Monad
| 
|     test :: (MonadPlus m) => [a] -> m Bool
|     test xs
|       =   do
|             (_:_) <- return xs
|             return True
|         `mplus`
|           do
|             return False
| 
|     main :: IO ()
|     main
|       = do  let x = fromJust (test [])
|             putStrLn (show x)
| 
| causes a run-time exception:
| 
|      *** Exception: GhcBug.hs:9: Non-exhaustive patterns in 'do'
expression
| 
| Version 5.04 correctly prints "False".
| 
| Cheers,
| Andrew Bromage
| _______________________________________________
| Glasgow-haskell-bugs mailing list
| Glasgow-haskell-bugs at haskell.org
| http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs



More information about the Glasgow-haskell-bugs mailing list