Skip to content

Inaccessible branches not detected

C Rodrigues (red5_2@hotmail.com) says: I was experimenting with using GADTs for subtyping when I found something interesting. Hopefully someone can satisfy my curiosity.

Here are two equivalent GADTs. My understanding was that GHC would translate Foo and Bar into isomorphic data types. However, GHC 6.12.3 generates better code for fooName than for barName. In fooName, there is no pattern match against FooExtra. In barName, there is a pattern match against BarExtra. What makes these data types different?

data Tag
data TagExtra

--------

data Foo a where
  Foo :: String -> Foo a
  FooExtra :: IORef String -> Foo TagExtra

-- The cmm code for fooName does not match against 'FooExtra'
fooName :: Foo Tag -> String
fooName (Foo s) = s

--------

data Bar a where
  Bar :: String -> Bar a
  BarExtra :: a ~ TagExtra => IORef String -> Bar a

-- The cmm code for barName will try to pattern-match against 'BarExtra'
barName :: Bar Tag -> String
barName (Bar s) = s
Trac metadata
Trac field Value
Version 7.0.3
Type Bug
TypeOfFailure OtherFailure
Priority normal
Resolution Unresolved
Component Compiler
Test case
Differential revisions
BlockedBy
Related
Blocking
CC red5_2@hotmail.com
Operating system
Architecture
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information