Teo Camarasu pushed to branch wip/T26875 at Glasgow Haskell Compiler / GHC

Commits:

13 changed files:

Changes:

  • libraries/base/src/System/IO.hs
    ... ... @@ -185,6 +185,7 @@ module System.IO
    185 185
          ) where
    
    186 186
     
    
    187 187
     import GHC.Internal.System.IO
    
    188
    +import GHC.Internal.Control.Monad.Fix (fixIO)
    
    188 189
     
    
    189 190
     -- $locking
    
    190 191
     -- Implementations should enforce as far as possible, at least locally to the
    

  • libraries/ghc-internal/src/GHC/Internal/Control/Monad/Fix.hs
    ... ... @@ -24,7 +24,8 @@
    24 24
     
    
    25 25
     module GHC.Internal.Control.Monad.Fix (
    
    26 26
             MonadFix(mfix),
    
    27
    -        fix
    
    27
    +        fix,
    
    28
    +        fixIO,
    
    28 29
       ) where
    
    29 30
     
    
    30 31
     import GHC.Internal.Data.Either
    
    ... ... @@ -35,11 +36,17 @@ import GHC.Internal.Data.Monoid ( Monoid, Dual(..), Sum(..), Product(..)
    35 36
     import GHC.Internal.Data.NonEmpty ( NonEmpty(..) )
    
    36 37
     import GHC.Internal.Data.Ord ( Down(..) )
    
    37 38
     import GHC.Internal.Data.Tuple ( Solo(..), snd )
    
    38
    -import GHC.Internal.Base ( Monad, errorWithoutStackTrace, (.) )
    
    39
    +import GHC.Internal.Base ( IO, Monad, errorWithoutStackTrace, (.), return, liftM )
    
    39 40
     import GHC.Internal.Generics
    
    40 41
     import GHC.Internal.List ( head, drop )
    
    41 42
     import GHC.Internal.Control.Monad.ST.Imp
    
    42
    -import GHC.Internal.System.IO
    
    43
    +import qualified GHC.Internal.Control.Monad.ST.Lazy.Imp as Lazy
    
    44
    +import GHC.Internal.Data.Functor.Identity (Identity(..))
    
    45
    +import GHC.Internal.MVar
    
    46
    +import GHC.Internal.IO.Unsafe
    
    47
    +import GHC.Internal.IO.Exception
    
    48
    +import GHC.Internal.TH.Monad
    
    49
    +import GHC.Internal.Control.Exception
    
    43 50
     
    
    44 51
     -- | Monads having fixed points with a \'knot-tying\' semantics.
    
    45 52
     -- Instances of 'MonadFix' should satisfy the following laws:
    
    ... ... @@ -102,6 +109,86 @@ instance MonadFix NonEmpty where
    102 109
     instance MonadFix IO where
    
    103 110
         mfix = fixIO
    
    104 111
     
    
    112
    +-- ---------------------------------------------------------------------------
    
    113
    +-- fixIO
    
    114
    +
    
    115
    +-- | The implementation of 'Control.Monad.Fix.mfix' for 'IO'.
    
    116
    +--
    
    117
    +-- This operation may fail with:
    
    118
    +--
    
    119
    +-- * 'FixIOException' if the function passed to 'fixIO' inspects its argument.
    
    120
    +--
    
    121
    +-- ==== __Examples__
    
    122
    +--
    
    123
    +-- the IO-action is only executed once. The recursion is only on the values.
    
    124
    +--
    
    125
    +-- >>> take 3 <$> fixIO (\x -> putStr ":D" >> (:x) <$> readLn @Int)
    
    126
    +-- :D
    
    127
    +-- 2
    
    128
    +-- [2,2,2]
    
    129
    +--
    
    130
    +-- If we are strict in the value, just as with 'Data.Function.fix', we do not get termination:
    
    131
    +--
    
    132
    +-- >>> fixIO (\x -> putStr x >> pure ('x' : x))
    
    133
    +-- * hangs forever *
    
    134
    +--
    
    135
    +-- We can tie the knot of a structure within 'IO' using 'fixIO':
    
    136
    +--
    
    137
    +-- @
    
    138
    +-- data Node = MkNode Int (IORef Node)
    
    139
    +--
    
    140
    +-- foo :: IO ()
    
    141
    +-- foo = do
    
    142
    +--   p \<- fixIO (\p -> newIORef (MkNode 0 p))
    
    143
    +--   q <- output p
    
    144
    +--   r <- output q
    
    145
    +--   _ <- output r
    
    146
    +--   pure ()
    
    147
    +--
    
    148
    +-- output :: IORef Node -> IO (IORef Node)
    
    149
    +-- output ref = do
    
    150
    +--   MkNode x p <- readIORef ref
    
    151
    +--   print x
    
    152
    +--   pure p
    
    153
    +-- @
    
    154
    +--
    
    155
    +-- >>> foo
    
    156
    +-- 0
    
    157
    +-- 0
    
    158
    +-- 0
    
    159
    +fixIO :: (a -> IO a) -> IO a
    
    160
    +fixIO k = do
    
    161
    +    m <- newEmptyMVar
    
    162
    +    ans <- unsafeDupableInterleaveIO
    
    163
    +             (readMVar m `catch` \BlockedIndefinitelyOnMVar ->
    
    164
    +                                    throwIO FixIOException)
    
    165
    +    result <- k ans
    
    166
    +    putMVar m result
    
    167
    +    return result
    
    168
    +
    
    169
    +-- Note [Blackholing in fixIO]
    
    170
    +-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    171
    +-- We do our own explicit black holing here, because GHC's lazy
    
    172
    +-- blackholing isn't enough.  In an infinite loop, GHC may run the IO
    
    173
    +-- computation a few times before it notices the loop, which is wrong.
    
    174
    +--
    
    175
    +-- NOTE2: the explicit black-holing with an IORef ran into trouble
    
    176
    +-- with multiple threads (see #5421), so now we use an MVar. We used
    
    177
    +-- to use takeMVar with unsafeInterleaveIO. This, however, uses noDuplicate#,
    
    178
    +-- which is not particularly cheap. Better to use readMVar, which can be
    
    179
    +-- performed in multiple threads safely, and to use unsafeDupableInterleaveIO
    
    180
    +-- to avoid the noDuplicate cost.
    
    181
    +--
    
    182
    +-- What we'd ideally want is probably an IVar, but we don't quite have those.
    
    183
    +-- STM TVars look like an option at first, but I don't think they are:
    
    184
    +-- we'd need to be able to write to the variable in an IO context, which can
    
    185
    +-- only be done using 'atomically', and 'atomically' is not allowed within
    
    186
    +-- unsafePerformIO. We can't know if someone will try to use the result
    
    187
    +-- of fixIO with unsafePerformIO!
    
    188
    +--
    
    189
    +-- See also System.IO.Unsafe.unsafeFixIO.
    
    190
    +--
    
    191
    +
    
    105 192
     -- | @since base-2.01
    
    106 193
     instance MonadFix ((->) r) where
    
    107 194
         mfix f = \ r -> let a = f a r in a
    
    ... ... @@ -116,6 +203,10 @@ instance MonadFix (Either e) where
    116 203
     instance MonadFix (ST s) where
    
    117 204
             mfix = fixST
    
    118 205
     
    
    206
    +-- | @since base-2.01
    
    207
    +instance MonadFix (Lazy.ST s) where
    
    208
    +        mfix = Lazy.fixST
    
    209
    +
    
    119 210
     -- Instances of Data.Monoid wrappers
    
    120 211
     
    
    121 212
     -- | @since base-4.8.0.0
    
    ... ... @@ -171,3 +262,24 @@ instance (MonadFix f, MonadFix g) => MonadFix (f :*: g) where
    171 262
     -- | @since base-4.12.0.0
    
    172 263
     instance MonadFix Down where
    
    173 264
         mfix f = Down (fix (getDown . f))
    
    265
    +
    
    266
    +
    
    267
    +-- | @since base-4.8.0.0
    
    268
    +instance MonadFix Identity where
    
    269
    +    mfix f   = Identity (fix (runIdentity . f))
    
    270
    +
    
    271
    +-- | If the function passed to 'mfix' inspects its argument,
    
    272
    +-- the resulting action will throw a 'FixIOException'.
    
    273
    +--
    
    274
    +-- @since 2.17.0.0
    
    275
    +instance MonadFix Q where
    
    276
    +  -- We use the same blackholing approach as in fixIO.
    
    277
    +  -- See Note [Blackholing in fixIO].
    
    278
    +  mfix k = do
    
    279
    +    m <- runIO newEmptyMVar
    
    280
    +    ans <- runIO (unsafeDupableInterleaveIO
    
    281
    +             (readMVar m `catch` \BlockedIndefinitelyOnMVar ->
    
    282
    +                                    throwIO FixIOException))
    
    283
    +    result <- k ans
    
    284
    +    runIO (putMVar m result)
    
    285
    +    return result

  • libraries/ghc-internal/src/GHC/Internal/Control/Monad/ST/Lazy/Imp.hs
    ... ... @@ -37,7 +37,6 @@ module GHC.Internal.Control.Monad.ST.Lazy.Imp (
    37 37
             unsafeIOToST
    
    38 38
         ) where
    
    39 39
     
    
    40
    -import GHC.Internal.Control.Monad.Fix
    
    41 40
     import GHC.Internal.Data.Tuple
    
    42 41
     
    
    43 42
     import qualified GHC.Internal.Control.Monad.ST.Imp as ST
    
    ... ... @@ -210,10 +209,6 @@ fixST m = ST (\ s ->
    210 209
     -- itself is demanded directly in the `let` body. See also
    
    211 210
     -- Note [Lazy ST: not producing lazy pairs].
    
    212 211
     
    
    213
    --- | @since base-2.01
    
    214
    -instance MonadFix (ST s) where
    
    215
    -        mfix = fixST
    
    216
    -
    
    217 212
     -- | @since base-4.23.0.0
    
    218 213
     instance Semigroup a => Semigroup (ST s a) where
    
    219 214
         (<>) = liftA2 (<>)
    

  • libraries/ghc-internal/src/GHC/Internal/Data/Functor/Identity.hs
    ... ... @@ -33,7 +33,6 @@ module GHC.Internal.Data.Functor.Identity (
    33 33
         Identity(..),
    
    34 34
       ) where
    
    35 35
     
    
    36
    -import GHC.Internal.Control.Monad.Fix
    
    37 36
     import GHC.Internal.Data.Bits (Bits, FiniteBits)
    
    38 37
     import GHC.Internal.Data.Coerce
    
    39 38
     import GHC.Internal.Data.Foldable
    
    ... ... @@ -143,7 +142,3 @@ instance Applicative Identity where
    143 142
     -- | @since base-4.8.0.0
    
    144 143
     instance Monad Identity where
    
    145 144
         m >>= k  = k (runIdentity m)
    146
    -
    
    147
    --- | @since base-4.8.0.0
    
    148
    -instance MonadFix Identity where
    
    149
    -    mfix f   = Identity (fix (runIdentity . f))

  • libraries/ghc-internal/src/GHC/Internal/System/IO.hs
    ... ... @@ -20,7 +20,6 @@ module GHC.Internal.System.IO (
    20 20
         -- * The IO monad
    
    21 21
     
    
    22 22
         IO,
    
    23
    -    fixIO,
    
    24 23
     
    
    25 24
         -- * Files and handles
    
    26 25
     
    
    ... ... @@ -258,7 +257,6 @@ import GHC.Internal.IO.Encoding
    258 257
     import GHC.Internal.Text.Read
    
    259 258
     import GHC.Internal.IO.StdHandles
    
    260 259
     import GHC.Internal.Show
    
    261
    -import GHC.Internal.MVar
    
    262 260
     -----------------------------------------------------------------------------
    
    263 261
     -- Standard IO
    
    264 262
     
    
    ... ... @@ -602,87 +600,6 @@ hReady h = hWaitForInput h 0
    602 600
     hPrint          :: Show a => Handle -> a -> IO ()
    
    603 601
     hPrint hdl      =  hPutStrLn hdl . show
    
    604 602
     
    
    605
    -
    
    606
    --- ---------------------------------------------------------------------------
    
    607
    --- fixIO
    
    608
    -
    
    609
    --- | The implementation of 'Control.Monad.Fix.mfix' for 'IO'.
    
    610
    ---
    
    611
    --- This operation may fail with:
    
    612
    ---
    
    613
    --- * 'FixIOException' if the function passed to 'fixIO' inspects its argument.
    
    614
    ---
    
    615
    --- ==== __Examples__
    
    616
    ---
    
    617
    --- the IO-action is only executed once. The recursion is only on the values.
    
    618
    ---
    
    619
    --- >>> take 3 <$> fixIO (\x -> putStr ":D" >> (:x) <$> readLn @Int)
    
    620
    --- :D
    
    621
    --- 2
    
    622
    --- [2,2,2]
    
    623
    ---
    
    624
    --- If we are strict in the value, just as with 'Data.Function.fix', we do not get termination:
    
    625
    ---
    
    626
    --- >>> fixIO (\x -> putStr x >> pure ('x' : x))
    
    627
    --- * hangs forever *
    
    628
    ---
    
    629
    --- We can tie the knot of a structure within 'IO' using 'fixIO':
    
    630
    ---
    
    631
    --- @
    
    632
    --- data Node = MkNode Int (IORef Node)
    
    633
    ---
    
    634
    --- foo :: IO ()
    
    635
    --- foo = do
    
    636
    ---   p \<- fixIO (\p -> newIORef (MkNode 0 p))
    
    637
    ---   q <- output p
    
    638
    ---   r <- output q
    
    639
    ---   _ <- output r
    
    640
    ---   pure ()
    
    641
    ---
    
    642
    --- output :: IORef Node -> IO (IORef Node)
    
    643
    --- output ref = do
    
    644
    ---   MkNode x p <- readIORef ref
    
    645
    ---   print x
    
    646
    ---   pure p
    
    647
    --- @
    
    648
    ---
    
    649
    --- >>> foo
    
    650
    --- 0
    
    651
    --- 0
    
    652
    --- 0
    
    653
    -fixIO :: (a -> IO a) -> IO a
    
    654
    -fixIO k = do
    
    655
    -    m <- newEmptyMVar
    
    656
    -    ans <- unsafeDupableInterleaveIO
    
    657
    -             (readMVar m `catch` \BlockedIndefinitelyOnMVar ->
    
    658
    -                                    throwIO FixIOException)
    
    659
    -    result <- k ans
    
    660
    -    putMVar m result
    
    661
    -    return result
    
    662
    -
    
    663
    --- Note [Blackholing in fixIO]
    
    664
    --- ~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    665
    --- We do our own explicit black holing here, because GHC's lazy
    
    666
    --- blackholing isn't enough.  In an infinite loop, GHC may run the IO
    
    667
    --- computation a few times before it notices the loop, which is wrong.
    
    668
    ---
    
    669
    --- NOTE2: the explicit black-holing with an IORef ran into trouble
    
    670
    --- with multiple threads (see #5421), so now we use an MVar. We used
    
    671
    --- to use takeMVar with unsafeInterleaveIO. This, however, uses noDuplicate#,
    
    672
    --- which is not particularly cheap. Better to use readMVar, which can be
    
    673
    --- performed in multiple threads safely, and to use unsafeDupableInterleaveIO
    
    674
    --- to avoid the noDuplicate cost.
    
    675
    ---
    
    676
    --- What we'd ideally want is probably an IVar, but we don't quite have those.
    
    677
    --- STM TVars look like an option at first, but I don't think they are:
    
    678
    --- we'd need to be able to write to the variable in an IO context, which can
    
    679
    --- only be done using 'atomically', and 'atomically' is not allowed within
    
    680
    --- unsafePerformIO. We can't know if someone will try to use the result
    
    681
    --- of fixIO with unsafePerformIO!
    
    682
    ---
    
    683
    --- See also System.IO.Unsafe.unsafeFixIO.
    
    684
    ---
    
    685
    -
    
    686 603
     -- | The function creates a temporary file in ReadWrite mode.
    
    687 604
     -- The created file isn\'t deleted automatically, so you need to delete it manually.
    
    688 605
     --
    

  • libraries/ghc-internal/src/GHC/Internal/TH/Monad.hs
    ... ... @@ -28,13 +28,8 @@ import Data.Data hiding (Fixity(..))
    28 28
     import Data.IORef
    
    29 29
     import System.IO.Unsafe ( unsafePerformIO )
    
    30 30
     import Control.Monad.IO.Class (MonadIO (..))
    
    31
    -import Control.Monad.Fix (MonadFix (..))
    
    32
    -import Control.Exception (BlockedIndefinitelyOnMVar (..), catch, throwIO)
    
    33
    -import Control.Exception.Base (FixIOException (..))
    
    34
    -import Control.Concurrent.MVar (newEmptyMVar, readMVar, putMVar)
    
    35 31
     import System.IO        ( hPutStrLn, stderr )
    
    36 32
     import qualified Data.Kind as Kind (Type)
    
    37
    -import GHC.IO.Unsafe    ( unsafeDupableInterleaveIO )
    
    38 33
     import GHC.Types        (TYPE, RuntimeRep(..))
    
    39 34
     #else
    
    40 35
     import GHC.Internal.Base hiding (NonEmpty(..),Type, Module, sequence)
    
    ... ... @@ -46,12 +41,8 @@ import GHC.Internal.Data.Foldable
    46 41
     import GHC.Internal.Data.Typeable
    
    47 42
     import GHC.Internal.Control.Monad.IO.Class
    
    48 43
     import GHC.Internal.Control.Monad.Fail
    
    49
    -import GHC.Internal.Control.Monad.Fix
    
    50
    -import GHC.Internal.Control.Exception
    
    51 44
     import GHC.Internal.Num
    
    52 45
     import GHC.Internal.IO.Unsafe
    
    53
    -import GHC.Internal.MVar
    
    54
    -import GHC.Internal.IO.Exception
    
    55 46
     import qualified GHC.Internal.Types as Kind (Type)
    
    56 47
     #endif
    
    57 48
     import GHC.Internal.ForeignSrcLang
    
    ... ... @@ -258,22 +249,6 @@ instance Semigroup a => Semigroup (Q a) where
    258 249
     instance Monoid a => Monoid (Q a) where
    
    259 250
       mempty = pure mempty
    
    260 251
     
    
    261
    --- | If the function passed to 'mfix' inspects its argument,
    
    262
    --- the resulting action will throw a 'FixIOException'.
    
    263
    ---
    
    264
    --- @since 2.17.0.0
    
    265
    -instance MonadFix Q where
    
    266
    -  -- We use the same blackholing approach as in fixIO.
    
    267
    -  -- See Note [Blackholing in fixIO] in System.IO in base.
    
    268
    -  mfix k = do
    
    269
    -    m <- runIO newEmptyMVar
    
    270
    -    ans <- runIO (unsafeDupableInterleaveIO
    
    271
    -             (readMVar m `catch` \BlockedIndefinitelyOnMVar ->
    
    272
    -                                    throwIO FixIOException))
    
    273
    -    result <- k ans
    
    274
    -    runIO (putMVar m result)
    
    275
    -    return result
    
    276
    -
    
    277 252
     
    
    278 253
     -----------------------------------------------------
    
    279 254
     --
    

  • testsuite/tests/ghci/scripts/ListTuplePunsPpr.stdout
    ... ... @@ -41,10 +41,10 @@ data Tuple2 a b = (,) a b
    41 41
       	-- Defined in ‘GHC.Internal.Tuple’
    
    42 42
     instance Traversable (Tuple2 a)
    
    43 43
       -- Defined in ‘GHC.Internal.Data.Traversable’
    
    44
    -instance Foldable (Tuple2 a)
    
    45
    -  -- Defined in ‘GHC.Internal.Data.Foldable’
    
    46 44
     instance Monoid a => Applicative (Tuple2 a)
    
    47 45
       -- Defined in ‘GHC.Internal.Base’
    
    46
    +instance Foldable (Tuple2 a)
    
    47
    +  -- Defined in ‘GHC.Internal.Data.Foldable’
    
    48 48
     instance Functor (Tuple2 a) -- Defined in ‘GHC.Internal.Base’
    
    49 49
     instance Monoid a => Monad (Tuple2 a)
    
    50 50
       -- Defined in ‘GHC.Internal.Base’
    

  • testsuite/tests/ghci/scripts/T4175.stdout
    ... ... @@ -44,8 +44,8 @@ instance Traversable Maybe
    44 44
       -- Defined in ‘GHC.Internal.Data.Traversable’
    
    45 45
     instance MonadFail Maybe
    
    46 46
       -- Defined in ‘GHC.Internal.Control.Monad.Fail’
    
    47
    -instance Foldable Maybe -- Defined in ‘GHC.Internal.Data.Foldable’
    
    48 47
     instance Applicative Maybe -- Defined in ‘GHC.Internal.Base’
    
    48
    +instance Foldable Maybe -- Defined in ‘GHC.Internal.Data.Foldable’
    
    49 49
     instance Functor Maybe -- Defined in ‘GHC.Internal.Base’
    
    50 50
     instance Monad Maybe -- Defined in ‘GHC.Internal.Base’
    
    51 51
     instance Semigroup a => Monoid (Maybe a)
    

  • testsuite/tests/interface-stability/base-exports.stdout
    ... ... @@ -11553,6 +11553,7 @@ instance forall e. GHC.Internal.Control.Monad.Fix.MonadFix (GHC.Internal.Data.Ei
    11553 11553
     instance forall r. GHC.Internal.Control.Monad.Fix.MonadFix ((->) r) -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    11554 11554
     instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Data.Monoid.First -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    11555 11555
     instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Types.IO -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    11556
    +instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Data.Functor.Identity.Identity -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    11556 11557
     instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Data.Monoid.Last -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    11557 11558
     instance GHC.Internal.Control.Monad.Fix.MonadFix [] -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    11558 11559
     instance forall (f :: * -> *) i (c :: GHC.Internal.Generics.Meta). GHC.Internal.Control.Monad.Fix.MonadFix f => GHC.Internal.Control.Monad.Fix.MonadFix (GHC.Internal.Generics.M1 i c f) -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    ... ... @@ -11560,14 +11561,14 @@ instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Maybe.Maybe -- Def
    11560 11561
     instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Base.NonEmpty -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    11561 11562
     instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Generics.Par1 -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    11562 11563
     instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Data.Semigroup.Internal.Product -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    11564
    +instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.TH.Monad.Q -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    11563 11565
     instance forall (f :: * -> *). GHC.Internal.Control.Monad.Fix.MonadFix f => GHC.Internal.Control.Monad.Fix.MonadFix (GHC.Internal.Generics.Rec1 f) -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    11566
    +instance forall s. GHC.Internal.Control.Monad.Fix.MonadFix (GHC.Internal.Control.Monad.ST.Lazy.Imp.ST s) -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    11564 11567
     instance forall s. GHC.Internal.Control.Monad.Fix.MonadFix (GHC.Internal.ST.ST s) -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    11565 11568
     instance GHC.Internal.Control.Monad.Fix.MonadFix Solo -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    11566 11569
     instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Data.Semigroup.Internal.Sum -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    11567 11570
     instance forall a. GHC.Internal.Base.Monoid a => GHC.Internal.Control.Monad.Fix.MonadFix ((,) a) -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    11568
    -instance forall s. GHC.Internal.Control.Monad.Fix.MonadFix (GHC.Internal.Control.Monad.ST.Lazy.Imp.ST s) -- Defined in ‘GHC.Internal.Control.Monad.ST.Lazy.Imp’
    
    11569 11571
     instance GHC.Internal.Control.Monad.Fix.MonadFix Data.Complex.Complex -- Defined in ‘Data.Complex’
    
    11570
    -instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Data.Functor.Identity.Identity -- Defined in ‘GHC.Internal.Data.Functor.Identity’
    
    11571 11572
     instance [safe] forall (f :: * -> *) (g :: * -> *). (GHC.Internal.Control.Monad.Fix.MonadFix f, GHC.Internal.Control.Monad.Fix.MonadFix g) => GHC.Internal.Control.Monad.Fix.MonadFix (Data.Functor.Product.Product f g) -- Defined in ‘Data.Functor.Product’
    
    11572 11573
     instance GHC.Internal.Control.Monad.Fix.MonadFix Data.Semigroup.First -- Defined in ‘Data.Semigroup’
    
    11573 11574
     instance GHC.Internal.Control.Monad.Fix.MonadFix Data.Semigroup.Last -- Defined in ‘Data.Semigroup’
    

  • testsuite/tests/interface-stability/base-exports.stdout-javascript-unknown-ghcjs
    ... ... @@ -11580,6 +11580,7 @@ instance forall e. GHC.Internal.Control.Monad.Fix.MonadFix (GHC.Internal.Data.Ei
    11580 11580
     instance forall r. GHC.Internal.Control.Monad.Fix.MonadFix ((->) r) -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    11581 11581
     instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Data.Monoid.First -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    11582 11582
     instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Types.IO -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    11583
    +instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Data.Functor.Identity.Identity -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    11583 11584
     instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Data.Monoid.Last -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    11584 11585
     instance GHC.Internal.Control.Monad.Fix.MonadFix [] -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    11585 11586
     instance forall (f :: * -> *) i (c :: GHC.Internal.Generics.Meta). GHC.Internal.Control.Monad.Fix.MonadFix f => GHC.Internal.Control.Monad.Fix.MonadFix (GHC.Internal.Generics.M1 i c f) -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    ... ... @@ -11587,14 +11588,14 @@ instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Maybe.Maybe -- Def
    11587 11588
     instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Base.NonEmpty -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    11588 11589
     instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Generics.Par1 -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    11589 11590
     instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Data.Semigroup.Internal.Product -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    11591
    +instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.TH.Monad.Q -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    11590 11592
     instance forall (f :: * -> *). GHC.Internal.Control.Monad.Fix.MonadFix f => GHC.Internal.Control.Monad.Fix.MonadFix (GHC.Internal.Generics.Rec1 f) -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    11593
    +instance forall s. GHC.Internal.Control.Monad.Fix.MonadFix (GHC.Internal.Control.Monad.ST.Lazy.Imp.ST s) -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    11591 11594
     instance forall s. GHC.Internal.Control.Monad.Fix.MonadFix (GHC.Internal.ST.ST s) -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    11592 11595
     instance GHC.Internal.Control.Monad.Fix.MonadFix Solo -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    11593 11596
     instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Data.Semigroup.Internal.Sum -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    11594 11597
     instance forall a. GHC.Internal.Base.Monoid a => GHC.Internal.Control.Monad.Fix.MonadFix ((,) a) -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    11595
    -instance forall s. GHC.Internal.Control.Monad.Fix.MonadFix (GHC.Internal.Control.Monad.ST.Lazy.Imp.ST s) -- Defined in ‘GHC.Internal.Control.Monad.ST.Lazy.Imp’
    
    11596 11598
     instance GHC.Internal.Control.Monad.Fix.MonadFix Data.Complex.Complex -- Defined in ‘Data.Complex’
    
    11597
    -instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Data.Functor.Identity.Identity -- Defined in ‘GHC.Internal.Data.Functor.Identity’
    
    11598 11599
     instance [safe] forall (f :: * -> *) (g :: * -> *). (GHC.Internal.Control.Monad.Fix.MonadFix f, GHC.Internal.Control.Monad.Fix.MonadFix g) => GHC.Internal.Control.Monad.Fix.MonadFix (Data.Functor.Product.Product f g) -- Defined in ‘Data.Functor.Product’
    
    11599 11600
     instance GHC.Internal.Control.Monad.Fix.MonadFix Data.Semigroup.First -- Defined in ‘Data.Semigroup’
    
    11600 11601
     instance GHC.Internal.Control.Monad.Fix.MonadFix Data.Semigroup.Last -- Defined in ‘Data.Semigroup’
    

  • testsuite/tests/interface-stability/base-exports.stdout-mingw32
    ... ... @@ -11811,6 +11811,7 @@ instance forall e. GHC.Internal.Control.Monad.Fix.MonadFix (GHC.Internal.Data.Ei
    11811 11811
     instance forall r. GHC.Internal.Control.Monad.Fix.MonadFix ((->) r) -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    11812 11812
     instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Data.Monoid.First -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    11813 11813
     instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Types.IO -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    11814
    +instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Data.Functor.Identity.Identity -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    11814 11815
     instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Data.Monoid.Last -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    11815 11816
     instance GHC.Internal.Control.Monad.Fix.MonadFix [] -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    11816 11817
     instance forall (f :: * -> *) i (c :: GHC.Internal.Generics.Meta). GHC.Internal.Control.Monad.Fix.MonadFix f => GHC.Internal.Control.Monad.Fix.MonadFix (GHC.Internal.Generics.M1 i c f) -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    ... ... @@ -11818,14 +11819,14 @@ instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Maybe.Maybe -- Def
    11818 11819
     instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Base.NonEmpty -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    11819 11820
     instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Generics.Par1 -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    11820 11821
     instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Data.Semigroup.Internal.Product -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    11822
    +instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.TH.Monad.Q -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    11821 11823
     instance forall (f :: * -> *). GHC.Internal.Control.Monad.Fix.MonadFix f => GHC.Internal.Control.Monad.Fix.MonadFix (GHC.Internal.Generics.Rec1 f) -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    11824
    +instance forall s. GHC.Internal.Control.Monad.Fix.MonadFix (GHC.Internal.Control.Monad.ST.Lazy.Imp.ST s) -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    11822 11825
     instance forall s. GHC.Internal.Control.Monad.Fix.MonadFix (GHC.Internal.ST.ST s) -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    11823 11826
     instance GHC.Internal.Control.Monad.Fix.MonadFix Solo -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    11824 11827
     instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Data.Semigroup.Internal.Sum -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    11825 11828
     instance forall a. GHC.Internal.Base.Monoid a => GHC.Internal.Control.Monad.Fix.MonadFix ((,) a) -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    11826
    -instance forall s. GHC.Internal.Control.Monad.Fix.MonadFix (GHC.Internal.Control.Monad.ST.Lazy.Imp.ST s) -- Defined in ‘GHC.Internal.Control.Monad.ST.Lazy.Imp’
    
    11827 11829
     instance GHC.Internal.Control.Monad.Fix.MonadFix Data.Complex.Complex -- Defined in ‘Data.Complex’
    
    11828
    -instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Data.Functor.Identity.Identity -- Defined in ‘GHC.Internal.Data.Functor.Identity’
    
    11829 11830
     instance [safe] forall (f :: * -> *) (g :: * -> *). (GHC.Internal.Control.Monad.Fix.MonadFix f, GHC.Internal.Control.Monad.Fix.MonadFix g) => GHC.Internal.Control.Monad.Fix.MonadFix (Data.Functor.Product.Product f g) -- Defined in ‘Data.Functor.Product’
    
    11830 11831
     instance GHC.Internal.Control.Monad.Fix.MonadFix Data.Semigroup.First -- Defined in ‘Data.Semigroup’
    
    11831 11832
     instance GHC.Internal.Control.Monad.Fix.MonadFix Data.Semigroup.Last -- Defined in ‘Data.Semigroup’
    

  • testsuite/tests/interface-stability/base-exports.stdout-ws-32
    ... ... @@ -11553,6 +11553,7 @@ instance forall e. GHC.Internal.Control.Monad.Fix.MonadFix (GHC.Internal.Data.Ei
    11553 11553
     instance forall r. GHC.Internal.Control.Monad.Fix.MonadFix ((->) r) -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    11554 11554
     instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Data.Monoid.First -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    11555 11555
     instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Types.IO -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    11556
    +instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Data.Functor.Identity.Identity -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    11556 11557
     instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Data.Monoid.Last -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    11557 11558
     instance GHC.Internal.Control.Monad.Fix.MonadFix [] -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    11558 11559
     instance forall (f :: * -> *) i (c :: GHC.Internal.Generics.Meta). GHC.Internal.Control.Monad.Fix.MonadFix f => GHC.Internal.Control.Monad.Fix.MonadFix (GHC.Internal.Generics.M1 i c f) -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    ... ... @@ -11560,14 +11561,14 @@ instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Maybe.Maybe -- Def
    11560 11561
     instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Base.NonEmpty -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    11561 11562
     instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Generics.Par1 -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    11562 11563
     instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Data.Semigroup.Internal.Product -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    11564
    +instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.TH.Monad.Q -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    11563 11565
     instance forall (f :: * -> *). GHC.Internal.Control.Monad.Fix.MonadFix f => GHC.Internal.Control.Monad.Fix.MonadFix (GHC.Internal.Generics.Rec1 f) -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    11566
    +instance forall s. GHC.Internal.Control.Monad.Fix.MonadFix (GHC.Internal.Control.Monad.ST.Lazy.Imp.ST s) -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    11564 11567
     instance forall s. GHC.Internal.Control.Monad.Fix.MonadFix (GHC.Internal.ST.ST s) -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    11565 11568
     instance GHC.Internal.Control.Monad.Fix.MonadFix Solo -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    11566 11569
     instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Data.Semigroup.Internal.Sum -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    11567 11570
     instance forall a. GHC.Internal.Base.Monoid a => GHC.Internal.Control.Monad.Fix.MonadFix ((,) a) -- Defined in ‘GHC.Internal.Control.Monad.Fix’
    
    11568
    -instance forall s. GHC.Internal.Control.Monad.Fix.MonadFix (GHC.Internal.Control.Monad.ST.Lazy.Imp.ST s) -- Defined in ‘GHC.Internal.Control.Monad.ST.Lazy.Imp’
    
    11569 11571
     instance GHC.Internal.Control.Monad.Fix.MonadFix Data.Complex.Complex -- Defined in ‘Data.Complex’
    
    11570
    -instance GHC.Internal.Control.Monad.Fix.MonadFix GHC.Internal.Data.Functor.Identity.Identity -- Defined in ‘GHC.Internal.Data.Functor.Identity’
    
    11571 11572
     instance [safe] forall (f :: * -> *) (g :: * -> *). (GHC.Internal.Control.Monad.Fix.MonadFix f, GHC.Internal.Control.Monad.Fix.MonadFix g) => GHC.Internal.Control.Monad.Fix.MonadFix (Data.Functor.Product.Product f g) -- Defined in ‘Data.Functor.Product’
    
    11572 11573
     instance GHC.Internal.Control.Monad.Fix.MonadFix Data.Semigroup.First -- Defined in ‘Data.Semigroup’
    
    11573 11574
     instance GHC.Internal.Control.Monad.Fix.MonadFix Data.Semigroup.Last -- Defined in ‘Data.Semigroup’
    

  • testsuite/tests/mdo/should_fail/mdofail006.stderr
    ... ... @@ -5,5 +5,5 @@ cyclic evaluation in fixIO
    5 5
     While handling thread blocked indefinitely in an MVar operation
    
    6 6
     
    
    7 7
     HasCallStack backtrace:
    
    8
    -  throwIO, called at libraries/ghc-internal/src/GHC/Internal/System/IO.hs:641:37 in ghc-internal:GHC.Internal.System.IO
    
    8
    +  throwIO, called at libraries/ghc-internal/src/GHC/Internal/Control/Monad/Fix.hs:167:37 in ghc-internal:GHC.Internal.Control.Monad.Fix
    
    9 9