Debug.Trace.trace optimized away when throwing exceptions, starting with GHC 8.8
Debug.Trace.trace messages printed with
-O0 are optimized away (e.g. with
-O1) in the presence of
Control.Exception.throw, starting with GHC 8.8.
Steps to reproduce
Compile and run this with either
import Control.Exception import Debug.Trace data MyException = MyException deriving Show instance Exception MyException main :: IO () main = handle (\ MyException -> putStrLn "Exception") $ do trace "Debugging" 5 `seq` throw MyException `seq` putStrLn "Survived Exception"
I expect the output
which is delivered with
-O0 and, up to GHC 8.6, also with
Starting with GHC 8.8 at
-O1, it prints only
My mental model for
Debug.Trace.trace :: String -> a -> a is one of
trace msg a = unsafePerformIO (putStrLn msg) `seq` a trace msg a = unsafePerformIO $ do putStrLn msg return a
Both of these actually work, meaning that the debug message is not optimized away for these simple implementations.
Trivium: I found this bug (as I would call it) when researching https://github.com/agda/agda/issues/5379.
- GHC versions used: 8.0.2, 8.2.2, 8.4.4, 8.6.4, 8.8.4, 8.10.4, 9.0.1
- Operating System: macOS Mojave 10.14.6
- System Architecture: Macky McMacFace