`-fspec-eval-dictfun` can speculate bottoms if you hide them within a module loop
```hs
{-# LANGUAGE UndecidableSuperClasses #-}
module Ty where
data T a = MkT a
class CB a => CA a where opA :: a -> Int
class CA a => CB a where opB :: a -> Int
```
```hs
{-# LANGUAGE FlexibleInstances, UndecidableInstances #-}
module Callee where -- Callee.hs-boot
import Ty
instance CB a => CB (T a)
instance CB Int
```
```hs
{-# LANGUAGE UndecidableInstances, FlexibleInstances, GADTs #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Mid where
import Ty
import {-# SOURCE #-} Callee
instance CB a => CA (T a) where opA _ = 1
instance CA Int where opA _ = 9
data Dict c where Dict :: c => Dict c
{-# NOINLINE keep #-}
keep :: [Dict c] -> Int
keep xs = length xs + 41
{-# NOINLINE g #-}
g :: forall a. CB a => a -> Int
g _ = keep [Dict :: Dict (CA (T a))]
```
```hs
{-# LANGUAGE UndecidableInstances, FlexibleInstances #-}
module Callee where -- Callee.hs
import Ty
import Mid
instance CB a => CB (T a) where opB _ = 2
instance CB Int where opB _ = 8
```
```hs
module Main where
import Mid
import Callee ()
main = print (g (1 :: Int))
```
```bash
$ ghc --make -O -fspec-eval-dictfun Main.hs && ./Main
<hangs>
```
We take care not to evaluate things that might be bottom, like the looping dictionary group at the start, but our analysis is defeated by boot files.
issue