diff --git a/compiler/prelude/primops.txt.pp b/compiler/prelude/primops.txt.pp index c16bc74de2a79849693e55e98a9f2b567d90fc44..8c936c6ac5736d06f000c6a6228849af035c1921 100644 --- a/compiler/prelude/primops.txt.pp +++ b/compiler/prelude/primops.txt.pp @@ -2019,9 +2019,11 @@ primop RaiseOp "raise#" GenPrimOp -- must be *precise* - we don't want the strictness analyser turning -- one kind of bottom into another, as it is allowed to do in pure code. -- --- We currently produce topRes, which is much too conservative (interfering --- with dead code elimination, unfortunately), but nothing else we currently --- have on tap is actually correct. +-- But we *do* want to know that it returns bottom after +-- being applied to two arguments, so that this function is strict in y +-- f x y | x>0 = raiseIO blah +-- | y>0 = return 1 +-- | otherwise = return 2 -- -- TODO Check that the above notes on @f@ are valid. The function successfully -- produces an IO exception when compiled without optimization. If we analyze @@ -2033,7 +2035,7 @@ primop RaiseOp "raise#" GenPrimOp primop RaiseIOOp "raiseIO#" GenPrimOp a -> State# RealWorld -> (# State# RealWorld, b #) with - strictness = { \ _arity -> mkClosedStrictSig [topDmd, topDmd] topRes } + strictness = { \ _arity -> mkClosedStrictSig [topDmd, topDmd] exnRes } out_of_line = True has_side_effects = True diff --git a/testsuite/tests/stranal/should_run/all.T b/testsuite/tests/stranal/should_run/all.T index a07900bbbc93fc8566af2f7a8600eb4d8e3a3b0f..076474608ef23845e9c68a922ed0e6633d000c04 100644 --- a/testsuite/tests/stranal/should_run/all.T +++ b/testsuite/tests/stranal/should_run/all.T @@ -14,4 +14,4 @@ test('T11076', normal, multimod_compile_and_run, ['T11076.hs', 'T11076_prim.cmm' test('T11555a', normal, compile_and_run, ['']) test('T12368', exit_code(1), compile_and_run, ['']) test('T12368a', exit_code(1), compile_and_run, ['']) -test('T13380', exit_code(1), compile_and_run, ['']) +test('T13380', [expect_broken(13380), exit_code(1)], compile_and_run, [''])