
#9380: ghc generates seemingly incorrect code -------------------------------------+------------------------------------- Reporter: qnikst | Owner: Type: bug | Status: closed Priority: normal | Milestone: Component: Compiler | Version: 7.8.3 Resolution: fixed | Keywords: Operating System: | Architecture: Unknown/Multiple Unknown/Multiple | Difficulty: Unknown Type of failure: Incorrect | Blocked By: result at runtime | Related Tickets: Test Case: gadt/T9380 | Blocking: | Differential Revisions: | -------------------------------------+------------------------------------- Comment (by maxtaldykin): Here is a bit more concise test case (derived from the original one): {{{ {-# LANGUAGE GADTs, DataKinds, KindSignatures #-} import Unsafe.Coerce data X = A | B data Y (x :: X) where YA :: Y A YB :: Y B Yany :: String -> Y x view :: Y a -> Y b view = unsafeCoerce main :: IO () main = case view YA of YA -> putStrLn "YA" YB -> putStrLn "YB" Yany x -> putStrLn x }}} This will cause segmentation fault on 7.8.3 due to matching `YA` with `Yany` and trying to access `String` that does not exist. In HEAD it will print `YA`. But is it really intended behavior? My reasoning is that this is an example of unsafe using of `unsafeCoerce`. Due to `view`'s parametricity GHC can infer that all valid implementations (except _|_) are of the form {{{ view :: Y a -> Y b view = const (Yany "some string here") }}} And it is safe to optimize `main` by dropping `YA` and `YB` cases. But if we allow such usage of `unsafeCoerce` then it is no longer possible to optimize cases even if `view` absolutely safe. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/9380#comment:6 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler