`catchSTM` does not roll back `newTVar`
Summary
It appears that catchSTM
does not rollback newTVar
when it encounters an exception. This results in a situation where a transaction is only partially rolled back, violating atomicity.
Steps to reproduce
Run this code block:
import GHC.Conc
import Control.Exception
data Error = Error (TVar String)
instance Show Error where
show (Error t) = "Error"
instance Exception Error
act = catchSTM (do
t <- newTVar "Hello"
writeTVar t "Hi"
throwSTM $ Error t)
(\(Error t) -> readTVar t)
main = atomically act >>= putStrLn
Expected behavior
It outputs Hello
. It appears that writeTVar
was rolled back but newTVar
was not.
Environment
- GHC version used: 8.6.5