
#11156: Type-changing record update catch-all in sum type doesn't typecheck -------------------------------------+------------------------------------- Reporter: afarmer | Owner: Type: bug | Status: closed Priority: normal | Milestone: Component: Compiler (Type | Version: 7.10.2 checker) | Resolution: invalid | Keywords: Operating System: Unknown/Multiple | Architecture: Type of failure: GHC rejects | Unknown/Multiple valid program | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Changes (by simonpj): * status: new => closed * resolution: => invalid Comment: GHC typechecks this {{{ ordify :: R Char -> R Int ordify r@(Foo {}) = r { x = ord (x r), y = ord (y r) } ordify r = r { x = ord (x r) } }}} as if you had written this: {{{ ordify :: R Char -> R Int ordify r@(Foo {}) = r { x = ord (x r), y = ord (y r) } ordify r = case r of Foo x y -> Foo (ord x) y -- Eeek! Bar x -> Bar (ord x) Baz x -> Bar (ord x) }}} The `Eeek!` line elicits the complaint. You may say that the `Foo` case is already dealt with, so this branch of the case is dead code, but in general that require sophisticated reasoning, certainly more than the type checker can do. So I don't see a way to fix this; sorry. I'll close as "invalid" because GHC is behaving as advertised; but the goal is not invalid of course! Simon -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/11156#comment:1 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler