summaryrefslogtreecommitdiff
path: root/testsuite/tests/concurrent/should_run/3279.hs
diff options
context:
space:
mode:
Diffstat (limited to 'testsuite/tests/concurrent/should_run/3279.hs')
-rw-r--r--testsuite/tests/concurrent/should_run/3279.hs25
1 files changed, 25 insertions, 0 deletions
diff --git a/testsuite/tests/concurrent/should_run/3279.hs b/testsuite/tests/concurrent/should_run/3279.hs
new file mode 100644
index 0000000000..279895f444
--- /dev/null
+++ b/testsuite/tests/concurrent/should_run/3279.hs
@@ -0,0 +1,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
+