summaryrefslogtreecommitdiff
path: root/testsuite/tests/concurrent/should_run/T3279.hs
blob: a90d38aaa448ac06a4588665307a301c55dca82e (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 GHC.IO (unsafeUnmask)

f :: Int
f = (1 +) . unsafePerformIO $ do
        error "foo" `catch` \(SomeException e) -> do
            myThreadId >>= flip throwTo e
            -- point X
            unsafeUnmask $ return 1

main :: IO ()
main = do
    evaluate f `catch` \(SomeException e) -> return 0
    -- the evaluation of 'x' is now suspended at point X
    tid <- mask_ $ forkIO (evaluate f >> return ())
    killThread tid
    -- now execute the 'unblock' above with a pending exception
    yield
    -- should print 1 + 1 = 2
    print f