-- We don't want to see a case match on the result -- of dataToTag#. We check that by looking for case -- matches on any literal other than 0# or 1#. We -- only really expect to see 1# here (and not the tag -- for OtherOS), but just in case GHC decides to get -- clever with its knowledge of the possible results -- of (==#), we also permit 0#. {-# LANGUAGE MagicHash, BangPatterns #-} module T14140 where import GHC.Exts data OS = Linux | Windows | OSX -- tier 1 desktop OSs | FreeBSD | OpenBSD | NetBSD -- other free Unix OSs | DragonFly | Solaris | AIX | HPUX | IRIX -- ageing Unix OSs | HaLVM -- bare metal / VMs / hypervisors | Hurd -- GNU's microkernel | IOS | Android -- mobile OSs | Ghcjs | OtherOS String -- This is similar to the derived Eq instance. We write it -- out manually to prevent future deriving changes from -- changing the test. instance Eq OS where OtherOS x == OtherOS y = x == y (!x) == (!y) = case dataToTag# x ==# dataToTag# y of 1# -> True _ -> False