Skip to content

Bounded Enums [minBound..maxBound] produces runtime error

Consider this code:

data MultiHeader
   = MultiHeaderCacheControl
   | MultiHeaderConnection
   | MultiHeaderContentEncoding
   -- ...
     deriving (Show, Eq, Enum, Bounded, Generic)

instance Hashable MultiHeader

multiHeaderCI :: MultiHeader -> CI.CI BS.ByteString
multiHeaderCI mh =
    case mh of
      MultiHeaderCacheControl -> "Cache-Control"
      MultiHeaderConnection -> "Connection"
      MultiHeaderContentEncoding -> "Content-Encoding"
      -- ...

multiHeaderMap :: HM.HashMap (CI.CI BS.ByteString) MultiHeader
multiHeaderMap =
    HM.fromList $ flip map [minBound..maxBound] $ \mh ->
    (multiHeaderCI mh, mh)

(derived from https://github.com/agrafix/Spock/blob/9c19c0159d99783aabf896d2742e231a5e85e0a5/src/Web/Spock/Internal/Wire.hs#L83-L121 )

When the multiHeaderMap accessed, a runtime error on GHC7.10.2 running on *some* [0] [1] Linux architectures is thrown. It does not occur on Mac or the travis build infrastructure [2].

uncaught exception: ErrorCall (toEnum{MultiHeader}: tag (-12565) is outside of enumeration's range (0,12))

I've marked the bug with 'core libraries', but I am not certain that that's the origin of it.

[0]: https://github.com/agrafix/Spock/issues/44 (Hydra / NixOS?) [1]: We've also seen it happen when used in docker with ubuntu:14.04 base image [2]: https://travis-ci.org/agrafix/Spock/builds/76877783

Trac metadata
Trac field Value
Version 7.10.2
Type Bug
TypeOfFailure OtherFailure
Priority normal
Resolution Unresolved
Component Core Libraries
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