Field imposters with DuplicateRecordFields and NamedFieldPuns.
There's a 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;
- 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}
- 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}
Trac metadata
Trac field | Value |
---|---|
Version | 8.2.2 |
Type | Bug |
TypeOfFailure | OtherFailure |
Priority | normal |
Resolution | Unresolved |
Component | Compiler |
Test case | |
Differential revisions | |
BlockedBy | |
Related | #13644 (closed) |
Blocking | |
CC | |
Operating system | |
Architecture |