Repository : ssh://darcs.haskell.org//srv/darcs/packages/base

On branch  : master

http://hackage.haskell.org/trac/ghc/changeset/cc4774d8b1e2736c4b9171db05451ba6355c98b6

>---------------------------------------------------------------

commit cc4774d8b1e2736c4b9171db05451ba6355c98b6
Author: Ian Lynagh <[email protected]>
Date:   Wed Oct 19 22:23:19 2011 +0100

    If an assertion fails, through it rather than a deeper error; fixes #5561
    
    An expression like
        assert False (throw e)
    should throw the assertion failure rather than e

>---------------------------------------------------------------

 GHC/IO/Exception.hs |    5 ++++-
 tests/all.T         |    1 +
 tests/assert.hs     |    9 +++++++++
 tests/assert.stderr |    2 ++
 4 files changed, 16 insertions(+), 1 deletions(-)

diff --git a/GHC/IO/Exception.hs b/GHC/IO/Exception.hs
index e3482cb..1c78e11 100644
--- a/GHC/IO/Exception.hs
+++ b/GHC/IO/Exception.hs
@@ -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
diff --git a/tests/all.T b/tests/all.T
index 0168ae6..7c9fc6e 100644
--- a/tests/all.T
+++ b/tests/all.T
@@ -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
index 0000000..f6e3c90
--- /dev/null
+++ b/tests/assert.hs
@@ -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
index 0000000..8d99aa0
--- /dev/null
+++ b/tests/assert.stderr
@@ -0,0 +1,2 @@
+assert: assert.hs:9:11-16: Assertion failed
+



_______________________________________________
Cvs-libraries mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/cvs-libraries

Reply via email to