[GHC] #14253: Pattern match checker mistakenly concludes pattern match on pattern synonym is unreachable

GHC ghc-devs at haskell.org
Thu Sep 21 13:56:35 UTC 2017


#14253: Pattern match checker mistakenly concludes pattern match on pattern synonym
is unreachable
-------------------------------------+-------------------------------------
        Reporter:  bgamari           |                Owner:  (none)
            Type:  bug               |               Status:  new
        Priority:  high              |            Milestone:  8.4.1
       Component:  Compiler          |              Version:  8.2.1
      Resolution:                    |             Keywords:
                                     |  PatternSynonyms,
                                     |  PatternMatchWarnings
Operating System:  Unknown/Multiple  |         Architecture:
 Type of failure:  GHC rejects       |  Unknown/Multiple
  valid program                      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:  #11984, #14098    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------
Changes (by RyanGlScott):

 * related:   => #11984, #14098


Comment:

 Phab:D4005 adds the rules to the GHC users' guide (proofreaders wanted).

 As for why this bug happens in the first place, I have a strong hunch that
 there's a symptom in common with #11984 (and #14098). The reason is
 because while this give a warning:

 {{{#!hs
 u :: S -> Bool
 u (MkS MkT2') = True
 }}}
 {{{
     Pattern match has inaccessible right hand side
     In an equation for ā€˜uā€™: u (MkS MkT2') = ...
 }}}

 You can work around the issue using the same trick in
 https://ghc.haskell.org/trac/ghc/ticket/11984#comment:7 :

 {{{#!hs
 u :: S -> Bool
 u (MkS x) = case x of
               MkT2' -> True
 }}}

 After this, instead of emitting the garbage inaccessible right-hand-side
 warning from before, GHC will warn:

 {{{
     Pattern match(es) are non-exhaustive
     In a case alternative: Patterns not matched: MkT1
 }}}

 As we would expect. So now we need to figure out why there is a
 discrepancy between the pattern match checker's coverage of `case` and
 nested constructors. (I'm hoping I gain some insight after talking to SPJ
 about this part of the codebase tomorrow.)

-- 
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/14253#comment:11>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list