id,summary,reporter,owner,description,type,status,priority,milestone,component,version,resolution,keywords,cc,os,architecture,failure,difficulty,testcase,blockedby,blocking,related
5168,Inaccessible branches not detected,simonpj,,"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
}}}",bug,closed,normal,,Compiler,7.0.3,fixed,,red5_2@…,Unknown/Multiple,Unknown/Multiple,None/Unknown,,simplCore/should_compile/NoMatch,,,
