content: {-# LANGUAGE MagicHash #-}
  
  module T7796 where
  
  import GHC.Exts
  
  --
  -- test for #7796
  --
  -- created by nicolas.frisby@gmail.com, feel free to email me!
  --
  -- a delicate interaction between specialisation and w/w creates a
  -- binding that is dead but is allocated at run-time
  --
  
  --
  -- we grep the -ddump-prep for $s$go, and the actual test expects a
  -- particular number of hits
  --
  -- thus the test will fail in two scenarios:
  --
  --   * the actually interesting case where the zombie $s$go binding
  --     survives, or
  --
  --   * the naming convention for specialised things changes, in which
  --     case the Makefile rule for this test needs to be updated to
  --     scrape the -ddump-prep output differently
  --
  
  --
  -- the zombie binding is $sgo; here's how we reproduce it:
  --
  --   1. specialise go such that the RHS of $sgo uses both $sgo and go
  --
  --   2. worker-wrapper $sgo but *not* go
  --
  -- thus: $sgo uses $w$sgo uses go uses $sgo
  --
  -- the key point: the last "use" is only via a RULE; see the ticket
  -- #7796 for more discussion and related tickets
  --
  
  data L = C Int# L | N Int# -- I'm using unboxed elements to avoid ww'd
                             -- unrelated to the bug
  
  host :: Eq b => b -> L -> Bool
  host b x =
    let go :: Eq a =>  -- must be used (to trigger specialise), but not
                       -- strict (else we ww the unspecialised version)
  
              a ->     -- must be strict, so that we ww the
                       -- specialisation
  
              L ->     -- not sure what this needs... but strict is
                       -- doing the trick
  
              Bool
  
        go d (N i) = d `seq` case i of
          0# -> True
          o  -> go b (N (i -# 1#)) -- NB must at (a ~ b)
  
        go d (C x xs) = (d == d) `seq` go d (C (x -# 1#) xs)
    in go (3 :: Int) x
  