Add regression test for #11555
authorBen Gamari <ben@smart-cactus.org>
Fri, 11 Mar 2016 10:20:43 +0000 (11:20 +0100)
committerBen Gamari <ben@smart-cactus.org>
Fri, 11 Mar 2016 12:20:07 +0000 (13:20 +0100)
testsuite/tests/stranal/should_run/T11555a.hs [new file with mode: 0644]
testsuite/tests/stranal/should_run/T11555a.stdout [new file with mode: 0644]
testsuite/tests/stranal/should_run/all.T

diff --git a/testsuite/tests/stranal/should_run/T11555a.hs b/testsuite/tests/stranal/should_run/T11555a.hs
new file mode 100644 (file)
index 0000000..29f2a49
--- /dev/null
@@ -0,0 +1,38 @@
+module Main(main) where
+
+import Control.Monad
+import Control.Exception
+import Control.Monad.Trans.Cont
+import GHC.Exts
+
+
+type RAW a = ContT () IO a
+
+-- See https://ghc.haskell.org/trac/ghc/ticket/11555
+catchSafe1, catchSafe2 :: IO a -> (SomeException -> IO a) -> IO a
+catchSafe1 a b = lazy a `catch` b
+catchSafe2 a b = join (evaluate a) `catch` b
+
+-- | Run and then call a continuation.
+runRAW1, runRAW2 :: RAW a -> (Either SomeException a -> IO ()) -> IO ()
+runRAW1 m k = m `runContT` (k . Right) `catchSafe1` \e -> k $ Left e
+runRAW2 m k = m `runContT` (k . Right) `catchSafe2` \e -> k $ Left e
+
+{-# NOINLINE run1 #-}
+run1 :: RAW ()-> IO ()
+run1 rs = do
+    runRAW1 rs $ \x -> case x of
+        Left e -> putStrLn "CAUGHT"
+        Right x -> return x
+
+{-# NOINLINE run2 #-}
+run2 :: RAW ()-> IO ()
+run2 rs = do
+    runRAW2 rs $ \x -> case x of
+        Left e -> putStrLn "CAUGHT"
+        Right x -> return x
+
+main :: IO ()
+main = do
+    run1 $ error "MISSED"
+    run2 $ error "MISSED"
diff --git a/testsuite/tests/stranal/should_run/T11555a.stdout b/testsuite/tests/stranal/should_run/T11555a.stdout
new file mode 100644 (file)
index 0000000..16ff8b4
--- /dev/null
@@ -0,0 +1,2 @@
+CAUGHT
+CAUGHT
index efd1afa..a4b550e 100644 (file)
@@ -11,3 +11,4 @@ test('T9254', normal, compile_and_run, [''])
 test('T10148', normal, compile_and_run, [''])
 test('T10218', normal, compile_and_run, [''])
 test('T11076', normal, multimod_compile_and_run, ['T11076.hs', 'T11076_prim.cmm'])
+test('T11555a', normal, compile_and_run, [''])