If an assertion fails, through it rather than a deeper error; fixes #5561
authorIan Lynagh <igloo@earth.li>
Wed, 19 Oct 2011 21:23:19 +0000 (22:23 +0100)
committerIan Lynagh <igloo@earth.li>
Wed, 19 Oct 2011 22:19:08 +0000 (23:19 +0100)
An expression like
    assert False (throw e)
should throw the assertion failure rather than e

GHC/IO/Exception.hs
tests/all.T
tests/assert.hs [new file with mode: 0644]
tests/assert.stderr [new file with mode: 0644]

index e3482cb..1c78e11 100644 (file)
@@ -303,9 +303,12 @@ instance Show IOException where
          "" -> id
          _  -> showString " (" . showString s . showString ")")
 
+-- Note the use of "lazy". This means that
+--     assert False (throw e)
+-- will throw the assertion failure rather than e. See trac #5561.
 assertError :: Addr# -> Bool -> a -> a
 assertError str predicate v
-  | predicate = v
+  | predicate = lazy v
   | otherwise = throw (AssertionFailed (untangle str "Assertion failed"))
 
 unsupportedOperation :: IOError
index 0168ae6..7c9fc6e 100644 (file)
@@ -5,3 +5,4 @@ test('enumRatio', normal, compile_and_run, [''])
 test('tempfiles', normal, compile_and_run, [''])
 test('fixed', normal, compile_and_run, [''])
 test('quotOverflow', normal, compile_and_run, [''])
+test('assert', exit_code(1), compile_and_run, ['-fno-ignore-asserts'])
diff --git a/tests/assert.hs b/tests/assert.hs
new file mode 100644 (file)
index 0000000..f6e3c90
--- /dev/null
@@ -0,0 +1,9 @@
+
+import Control.Exception
+
+-- We want to get the assertion failure, not the overflow exception.
+-- trac #5561.
+
+main :: IO ()
+main = let e1 i = throw Overflow
+       in assert False (e1 5)
diff --git a/tests/assert.stderr b/tests/assert.stderr
new file mode 100644 (file)
index 0000000..8d99aa0
--- /dev/null
@@ -0,0 +1,2 @@
+assert: assert.hs:9:11-16: Assertion failed
+