blob: 279895f44471e563bab11f8f968181d828ee154d (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
-- test for #3279
import System.IO.Unsafe
import GHC.Conc
import Control.Exception
import Prelude hiding (catch)
f :: Int
f = (1 +) . unsafePerformIO $ do
error "foo" `catch` \(SomeException e) -> do
myThreadId >>= flip throwTo e
-- point X
unblock $ return 1
main :: IO ()
main = do
evaluate f `catch` \(SomeException e) -> return 0
-- the evaluation of 'x' is now suspended at point X
tid <- block $ forkIO (evaluate f >> return ())
killThread tid
-- now execute the 'unblock' above with a pending exception
yield
-- should print 1 + 1 = 2
print f
|