"hadrian/build.stack.bat" did not exist on "master"
Loop with undecidable instances in GHC 9.4.3
Summary
Certain undecidable instances are compiled into infinite loops in GHC 9.4.3.
Steps to reproduce
This problem showed up in the logict-sequence test suite. Li-yao Xia somehow managed to figure out that the problem was the way certain instances were compiled. Here's a greatly reduced version:
-- Everything works fine with -O0 and -O. Only -O2 fails.
{-# OPTIONS_GHC -O2 #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE MonoLocalBinds #-}
import Data.Function (on)
import Data.Functor.Identity
data ViewT m a
= Empty
| a :< SeqT m a
newtype SeqT m a = SeqT [m (ViewT m a)]
toViewT :: Monad m => SeqT m a -> m (ViewT m a)
toViewT (SeqT []) = pure Empty
toViewT (SeqT (h : t)) = h >>= \case
Empty -> toViewT (SeqT t)
hi :< SeqT ti -> pure (hi :< SeqT (ti ++ t))
instance (Eq (m (ViewT m a)), Monad m) => Eq (SeqT m a) where
(==) = (==) `on` toViewT
deriving instance (Eq a, Eq (SeqT m a)) => Eq (ViewT m a)
example :: SeqT Identity Int
example = SeqT []
main :: IO ()
main = print (example == example)
When compiled with GHC 9.4.3, this prints
Buggle: <<loop>>
When compiled with versions 7.10.3, 8.0.2, 8.2.2, 8.4.4, 8.6.5, 8.8.4, 8.10.4, 9.0.2, or 9.2.5, it prints
True
For version 7.8, it works once the source is adjusted appropriately.
Expected behavior
I expect it to print True.
Environment
- GHC version used: 9.4.3
Optional:
- Operating System:
- System Architecture:
Edited by David Feuer