content: {-# LANGUAGE PartialTypeSignatures #-}
  {-# LANGUAGE Strict #-}
  
  {- Notes on T18223
  ~~~~~~~~~~~~~~~~~~
  If we inline
        modify' :: MonadState s m => (s -> s) -> m ()
  early, before the specialiser, the casts all collapse immediately.
  It turns out that fixing #21286 causes this to happen, because
  we no longer w/w modify'.
  
  If we don't inline it before the specialiser we generate
  a specialised version of it.  Then it gets inlined and all
  the casts collapse, but we end up keeping the code for the
  specialised version right through the pipeline.
  -}
  
  import Control.Monad.State
  
  tester :: MonadState a m => m ()
  tester = modify' id
  
  -- manyState :: StateT () (StateT () IO) () -> IO ()
  -- manyState :: _ -> IO ()
  manyState x =
    (flip evalStateT ()     -- 1
    . flip evalStateT ()    -- 2
    . flip evalStateT ()    -- 3
    . flip evalStateT ()    -- 4
    . flip evalStateT ()    -- 5
    . flip evalStateT ()    -- 6
    . flip evalStateT ()    -- 7
    . flip evalStateT ()    -- 8
    . flip evalStateT ()    -- 9
    . flip evalStateT ()
    . flip evalStateT ()
    . flip evalStateT ()
  
    . flip evalStateT ()
    . flip evalStateT ()
    . flip evalStateT ()
    . flip evalStateT ()
    . flip evalStateT ()
    . flip evalStateT ()
    . flip evalStateT ()
  
    . flip evalStateT ()
    . flip evalStateT ()
    . flip evalStateT ()
    . flip evalStateT ()
    . flip evalStateT ()
    . flip evalStateT ()
    . flip evalStateT ()
    . flip evalStateT ()
    . flip evalStateT ()
    . flip evalStateT ()
    . flip evalStateT ()
    . flip evalStateT ()
    . flip evalStateT ()
    . flip evalStateT ()
    . flip evalStateT ()
    . flip evalStateT ()
    . flip evalStateT ()
    . flip evalStateT ()
    . flip evalStateT ()
    . flip evalStateT ()
    . flip evalStateT ()
    . flip evalStateT ()
    . flip evalStateT ()
    . flip evalStateT ()
    . flip evalStateT ()
  
    . flip evalStateT ()
    . flip evalStateT ()
    . flip evalStateT ()
    . flip evalStateT ()
    . flip evalStateT ()
    . flip evalStateT ()
    . flip evalStateT ()
    . flip evalStateT ()
    . flip evalStateT ()
    . flip evalStateT ()
    . flip evalStateT ()
    . flip evalStateT ()
    . flip evalStateT ()
    . flip evalStateT ()
    . flip evalStateT ()
    . flip evalStateT ()
    ) x :: IO ()
  
  main :: IO ()
  main = manyState tester >>= print
  