[GHC] #15886: Spurious warning about incomplete pattern with PatternSynonyms

GHC ghc-devs at haskell.org
Sat Nov 10 11:13:16 UTC 2018


#15886: Spurious warning about incomplete pattern with PatternSynonyms
-------------------------------------+-------------------------------------
        Reporter:  selinger          |                Owner:  (none)
            Type:  bug               |               Status:  closed
        Priority:  normal            |            Milestone:  8.6.3
       Component:  Compiler          |              Version:  8.6.1
      Resolution:  invalid           |             Keywords:
                                     |  PatternSynonyms,
                                     |  PatternMatchWarnings
Operating System:  Linux             |         Architecture:  x86_64
 Type of failure:  Incorrect         |  (amd64)
  error/warning at compile-time      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------
Changes (by RyanGlScott):

 * keywords:   => PatternSynonyms, PatternMatchWarnings
 * status:  new => closed
 * resolution:   => invalid


Comment:

 This is expected behavior. Refer to the
 [https://downloads.haskell.org/~ghc/8.4.1/docs/html/users_guide/glasgow_exts.html?highlight=patternsynonyms
 #complete-pragmas users' guide section] on `COMPLETE` sets:

 > The `COMPLETE` pragma is used to inform the pattern match checker that a
 certain set of patterns is complete and that any function which matches on
 all the specified patterns is total.
 >
 > The most common usage of `COMPLETE pragmas` is with //Pattern
 synonyms//. On its own, the checker is very naive and assumes that any
 match involving a pattern synonym will fail. As a result, any pattern
 match on a pattern synonym is regarded as incomplete unless the user adds
 a catch-all case.

 As this suggests, you need to declare a `COMPLETE` set for `X` in order
 for the coverage checker to reason about it. This variant of your program,
 for instance, does not emit any warnings when compiled with `-Wincomplete-
 patterns`:

 {{{#!hs
 {-# LANGUAGE ViewPatterns #-}
 {-# LANGUAGE PatternSynonyms #-}

 module Test where

 f :: Int -> Bool
 f (id -> a) = True

 pattern X a <- (id -> a)
 {-# COMPLETE X :: Int #-}

 g :: Int -> Bool
 g (X a) = True
 }}}

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


More information about the ghc-tickets mailing list