Skip to content

Regression in forall typechecking

The following bug showed up when trying to install ghc-mod against the current ghc-7.10 branch

Ths code below, from https://github.com/DanielG/ghc-mod/blob/b52c0a5d767282369f2748c5ec070b802ed8e23c/Language/Haskell/GhcMod/Monad/Types.hs#L346

instance (MonadBaseControl IO m) => MonadBaseControl IO (GhcModT m) where
    type StM (GhcModT m) a =
          StM (StateT GhcModState
                (ErrorT GhcModError
                  (JournalT GhcModLog
                    (ReaderT GhcModEnv m) ) ) ) a
    liftBaseWith f = GhcModT . liftBaseWith $ \runInBase ->
        f $ runInBase . unGhcModT

    restoreM = GhcModT . restoreM
    {-# INLINE liftBaseWith #-}
    {-# INLINE restoreM #-}

Which compiles fine with GHC 7.10.1 now has the error

Language/Haskell/GhcMod/Monad/Types.hs:346:13:
    Couldn't match expected type ‘StateT
                                    GhcModState
                                    (ErrorT GhcModError (JournalT GhcModLog (ReaderT GhcModEnv m)))
                                    a1
                                  -> IO (StM m (Either GhcModError (a1, GhcModState), GhcModLog))’
                with actual type ‘forall a2.
                                  StateT
                                    GhcModState
                                    (ErrorT GhcModError (JournalT GhcModLog (ReaderT GhcModEnv m)))
                                    a2
                                  -> IO
                                       (StM
                                          (StateT
                                             GhcModState
                                             (ErrorT
                                                GhcModError
                                                (JournalT GhcModLog (ReaderT GhcModEnv m))))
                                          a2)’
    Relevant bindings include
      runInBase :: forall a.
                   StateT
                     GhcModState
                     (ErrorT GhcModError (JournalT GhcModLog (ReaderT GhcModEnv m)))
                     a
                   -> IO
                        (StM
                           (StateT
                              GhcModState
                              (ErrorT GhcModError (JournalT GhcModLog (ReaderT GhcModEnv m))))
                           a)
        (bound at Language/Haskell/GhcMod/Monad/Types.hs:345:48)
      f :: RunInBase (GhcModT m) IO -> IO a
        (bound at Language/Haskell/GhcMod/Monad/Types.hs:345:18)
      liftBaseWith :: (RunInBase (GhcModT m) IO -> IO a) -> GhcModT m a
        (bound at Language/Haskell/GhcMod/Monad/Types.hs:345:5)
    In the first argument of ‘(.)’, namely ‘runInBase’
    In the second argument of ‘($)’, namely ‘runInBase . unGhcModT’

A laborious git bisect tracked it down to

681d82c0d44f06f0b958b75778c30b0910df982b is the first bad commit
commit 681d82c0d44f06f0b958b75778c30b0910df982b
Author: Simon Peyton Jones <simonpj@microsoft.com>
Date:   Tue Apr 7 14:45:04 2015 +0100

    Look inside synonyms for foralls when unifying
    
    This fixes Trac #10194
    
    (cherry picked from commit 553c5182156c5e4c15e3bd1c17c6d83a95a6c408)

:040000 040000 1f0e62661ed1c48a9cbfab72ca3e38bb9e501412 ef6786fdb952d3446121b27b56f6103533d52356 M	compiler
:040000 040000 d607f1bff94578b0677df9cba01371dad6b26a32 ac715cec4fd8d43a53ecee132eae2b4c0c65e31a M	testsuite
Trac metadata
Trac field Value
Version 7.10.1
Type Bug
TypeOfFailure OtherFailure
Priority high
Resolution Unresolved
Component Compiler (Type checker)
Test case
Differential revisions
BlockedBy
Related
Blocking
CC
Operating system
Architecture
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information