
#14630: name shadowing warnings by record pattern synonyms + RecordWildCards or NamedFieldPuns -------------------------------------+------------------------------------- Reporter: mizunashi_mana | Owner: (none) Type: bug | Status: new Priority: normal | Milestone: Component: Compiler | Version: 8.2.2 Resolution: | Keywords: | PatternSynonyms Operating System: Unknown/Multiple | Architecture: Type of failure: Incorrect | Unknown/Multiple error/warning at compile-time | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Comment (by RyanGlScott): Hrm, I'm not sure how to fix this. The issues lies with the `is_shadowed_gre` function in `RnUtils`, defined [http://git.haskell.org/ghc.git/blob/7a25659efc4d22086a9e75dc90e3701c1706c625... here]: {{{#!hs is_shadowed_gre :: GlobalRdrElt -> RnM Bool -- Returns False for record selectors that are shadowed, when -- punning or wild-cards are on (cf Trac #2723) is_shadowed_gre gre | isRecFldGRE gre = do { dflags <- getDynFlags ; return $ not (xopt LangExt.RecordPuns dflags || xopt LangExt.RecordWildCards dflags) } is_shadowed_gre _other = return True }}} This uses the `isRecFldGRE` function to detect record selectors, which is in turn defined [http://git.haskell.org/ghc.git/blob/649e777211fe08432900093002547d7358f92d82... as follows]: {{{#!hs isRecFldGRE :: GlobalRdrElt -> Bool isRecFldGRE (GRE {gre_par = FldParent{}}) = True isRecFldGRE _ = False }}} The problem is that pattern synonym record selectors don't use `FldParent` as their `Parent`, but rather `NoParent`. At first, I thought this might have been an oversight, but it turns out there's a reason for this, as explained in [http://git.haskell.org/ghc.git/blob/649e777211fe08432900093002547d7358f92d82... this comment]:
Record pattern synonym selectors are treated differently. Their parent information is `NoParent` in the module in which they are defined. This is because a pattern synonym `P` has no parent constructor either.
So it seems that we need to adjust `isRecFldGRE` to be aware of this fact somehow. But I doubt that having `isRecFldGRE` return `True` whenever it sees //any// occurrence of `NoParent` is the right thing to do... any ideas? -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/14630#comment:2 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler