
#14892: Field imposters with DuplicateRecordFields -------------------------------------+------------------------------------- Reporter: philderbeast | Owner: (none) Type: bug | Status: new Priority: normal | Milestone: Component: Compiler | Version: 8.2.2 Keywords: | Operating System: MacOS X Architecture: x86_64 | Type of failure: GHC accepts (amd64) | invalid program Test Case: | Blocked By: Blocking: | Related Tickets: 13644 Differential Rev(s): | Wiki Page: -------------------------------------+------------------------------------- There's a [[https://github.com/BlockScope/ghc-panic-12158|test case]] for this ghc panic. If I use `NamedFieldPuns` I wish this could more delicately pick the right field. If my record use is qualified then please restrict the set of candidate field names to use punned. {{{ {-# LANGUAGE DuplicateRecordFields #-} module Geodesy (X(..), Y(..)) where data X a = X {x :: a} data Y a = Y {x :: a} }}} {{{ {-# LANGUAGE NamedFieldPuns #-} module GhcPanic12158 where import qualified Geodesy as G (X(..)) import Geodesy (Y(..)) update :: G.X a -> G.X a update G.X{x} = G.X{x = x} }}} {{{
stack build ghc-panic-translateConPatVec-lookup-0.1.0: build (lib) Preprocessing library for ghc-panic-translateConPatVec-lookup-0.1.0.. Building library for ghc-panic-translateConPatVec-lookup-0.1.0.. [1 of 3] Compiling Geodesy [2 of 3] Compiling GhcPanic12158 ghc: panic! (the 'impossible' happened) (GHC version 8.2.2 for x86_64-apple-darwin): translateConPatVec: lookup
Please report this as a GHC bug: http://www.haskell.org/ghc/reportabug }}} There are some fixes; 1. Add DuplicateRecordFields. {{{ {-# LANGUAGE NamedFieldPuns #-} {-# LANGUAGE DuplicateRecordFields #-} module GhcPanic12158 where import qualified Geodesy as G (X(..)) import Geodesy (Y(..)) update :: G.X a -> G.X a update G.X{x} = G.X{x = x} }}} 2. Use qualified field names. {{{ {-# LANGUAGE NamedFieldPuns #-} module GhcPanic12158 where import qualified Geodesy as G (X(..)) import Geodesy (Y(..)) update :: G.X a -> G.X a update G.X{G.x} = G.X{G.x = x} }}} Interestingly, if I don't import the record with the clashing field name then GHC complains. {{{ {-# LANGUAGE NamedFieldPuns #-} module GhcPanic12158 where import qualified Geodesy as G (X(..)) update :: G.X a -> G.X a update G.X{x} = G.X{x = x} }}} {{{
stack build ghc-panic-translateConPatVec-lookup-0.1.0: unregistering ghc-panic-translateConPatVec-lookup-0.1.0: build (lib) Preprocessing library for ghc-panic-translateConPatVec-lookup-0.1.0.. Building library for ghc-panic-translateConPatVec-lookup-0.1.0.. [3 of 3] Compiling GhcPanic12158
/ghc-panic-12158/earth/library/GhcPanic12158.hs:8:12: error: Not in scope: ‘x’ | 8 | update G.X{x} = G.X{x = x} | ^ /ghc-panic-12158/earth/library/GhcPanic12158.hs:8:21: error: Not in scope: ‘x’ | 8 | update G.X{x} = G.X{x = x} }}} -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/14892 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler