[GHC] #15554: COMPLETE pragmas make overlapping-patterns warnings behave oddly

GHC ghc-devs at haskell.org
Wed Aug 22 00:07:03 UTC 2018


#15554: COMPLETE pragmas make overlapping-patterns warnings behave oddly
-------------------------------------+-------------------------------------
           Reporter:  staffehn       |             Owner:  (none)
               Type:  bug            |            Status:  new
           Priority:  normal         |         Milestone:  8.6.1
          Component:  Compiler       |           Version:  8.4.3
           Keywords:                 |  Operating System:  Unknown/Multiple
       Architecture:                 |   Type of failure:  None/Unknown
  Unknown/Multiple                   |
          Test Case:                 |        Blocked By:
           Blocking:                 |   Related Tickets:
Differential Rev(s):                 |         Wiki Page:
-------------------------------------+-------------------------------------
 I can’t really quantify what’s wrong and what’s intended here, here’s a
 test file comparing different contrasting examples of similar functions
 which generate no or strange warnings in the cases that use a datatype
 with COMPLETE pragmas on pattern synonyms.

 {{{#!hs
 {-   1 -}  {-# LANGUAGE PatternSynonyms, ViewPatterns #-}
 {-   2 -}
 {-   3 -}  module M where
 {-   4 -}
 {-   5 -}  data T = A | B | C
 {-   6 -}
 {-   7 -}  isBC :: T -> Bool
 {-   8 -}  isBC A = False
 {-   9 -}  isBC B = True
 {-  10 -}  isBC C = True
 {-  11 -}
 {-  12 -}  pattern BC :: T
 {-  13 -}  pattern BC <- (isBC -> True)
 {-  14 -}  {-# COMPLETE A, BC #-}
 {-  15 -}
 {-  16 -}  g1 :: T -> Int
 {-  17 -}  g1 A = 1
 {-  18 -}  g1 BC = 2
 {-  19 -}  g1 _ = 3
 {-  20 -}
 {-  21 -}  --  M.hs:18:1: warning: [-Woverlapping-patterns]
 {-  22 -}  --      Pattern match is redundant
 {-  23 -}  --      In an equation for `g1': g1 BC = ...
 {-  24 -}  --     |
 {-  25 -}  --  18 | {-  18 -}  g1 BC = 2
 {-  26 -}  --     |            ^^^^^^^^^
 {-  27 -}
 {-  28 -}  g2 :: T -> Int
 {-  29 -}  g2 BC = 2
 {-  30 -}  g2 A = 1
 {-  31 -}  g2 _ = 3
 {-  32 -}
 {-  33 -}  -- g2: no warnings
 {-  34 -}
 {-  35 -}  g3 :: T -> Int
 {-  36 -}  g3 BC = 2
 {-  37 -}  g3 _ = 1
 {-  38 -}  g3 A = 3
 {-  39 -}  g3 A = 4
 {-  40 -}  g3 B = 4
 {-  41 -}  g3 B = 4
 {-  42 -}  g3 C = 4
 {-  43 -}  g3 C = 4
 {-  44 -}  g3 _ = 4
 {-  45 -}  g3 _ = 4
 {-  46 -}
 {-  47 -}  -- g3: no warnings
 {-  48 -}
 {-  49 -}  data T' = A' | B' | C'
 {-  50 -}
 {-  51 -}  isBC' :: T' -> Bool
 {-  52 -}  isBC' A' = False
 {-  53 -}  isBC' B' = True
 {-  54 -}  isBC' C' = True
 {-  55 -}
 {-  56 -}  pattern BC' :: T'
 {-  57 -}  pattern BC' <- (isBC' -> True)
 {-  58 -}  -- no COMPLETE pragma
 {-  59 -}
 {-  60 -}  g3' :: T' -> Int
 {-  61 -}  g3' BC' = 2
 {-  62 -}  g3' _ = 1
 {-  63 -}  g3' A' = 3
 {-  64 -}  g3' A' = 4
 {-  65 -}  g3' B' = 4
 {-  66 -}  g3' B' = 4
 {-  67 -}  g3' C' = 4
 {-  68 -}  g3' C' = 4
 {-  69 -}  g3' _ = 4
 {-  70 -}  g3' _ = 4
 {-  71 -}
 {-  72 -}  --  M.hs:63:1: warning: [-Woverlapping-patterns]
 {-  73 -}  --      Pattern match is redundant
 {-  74 -}  --      In an equation for g3': g3' A' = ...
 {-  75 -}  --     |
 {-  76 -}  --  63 | {-  63 -}  g3' A' = 3
 {-  77 -}  --     |            ^^^^^^^^^^
 {-  78 -}  --
 {-  79 -}  --  M.hs:64:1: warning: [-Woverlapping-patterns]
 {-  80 -}  --      Pattern match is redundant
 {-  81 -}  --      In an equation for g3': g3' A' = ...
 {-  82 -}  --     |
 {-  83 -}  --  64 | {-  64 -}  g3' A' = 4
 {-  84 -}  --     |            ^^^^^^^^^^
 {-  85 -}  --
 {-  86 -}  --  M.hs:65:1: warning: [-Woverlapping-patterns]
 {-  87 -}  --      Pattern match is redundant
 {-  88 -}  --      In an equation for g3': g3' B' = ...
 {-  89 -}  --     |
 {-  90 -}  --  65 | {-  65 -}  g3' B' = 4
 {-  91 -}  --     |            ^^^^^^^^^^
 {-  92 -}  --
 {-  93 -}  --  M.hs:66:1: warning: [-Woverlapping-patterns]
 {-  94 -}  --      Pattern match is redundant
 {-  95 -}  --      In an equation for g3': g3' B' = ...
 {-  96 -}  --     |
 {-  97 -}  --  66 | {-  66 -}  g3' B' = 4
 {-  98 -}  --     |            ^^^^^^^^^^
 {-  99 -}  --
 {- 100 -}  --  M.hs:67:1: warning: [-Woverlapping-patterns]
 {- 101 -}  --      Pattern match is redundant
 {- 102 -}  --      In an equation for g3': g3' C' = ...
 {- 103 -}  --     |
 {- 104 -}  --  67 | {-  67 -}  g3' C' = 4
 {- 105 -}  --     |            ^^^^^^^^^^
 {- 106 -}  --
 {- 107 -}  --  M.hs:68:1: warning: [-Woverlapping-patterns]
 {- 108 -}  --      Pattern match is redundant
 {- 109 -}  --      In an equation for g3': g3' C' = ...
 {- 110 -}  --     |
 {- 111 -}  --  68 | {-  68 -}  g3' C' = 4
 {- 112 -}  --     |            ^^^^^^^^^^
 {- 113 -}  --
 {- 114 -}  --  M.hs:69:1: warning: [-Woverlapping-patterns]
 {- 115 -}  --      Pattern match is redundant
 {- 116 -}  --      In an equation for g3': g3' _ = ...
 {- 117 -}  --     |
 {- 118 -}  --  69 | {-  69 -}  g3' _ = 4
 {- 119 -}  --     |            ^^^^^^^^^
 {- 120 -}  --
 {- 121 -}  --  M.hs:70:1: warning: [-Woverlapping-patterns]
 {- 122 -}  --      Pattern match is redundant
 {- 123 -}  --      In an equation for g3': g3' _ = ...
 {- 124 -}  --     |
 {- 125 -}  --  70 | {-  70 -}  g3' _ = 4
 {- 126 -}  --     |            ^^^^^^^^^
 {- 127 -}
 {- 128 -}
 {- 129 -}  data S = X
 {- 130 -}
 {- 131 -}  pattern Y :: S
 {- 132 -}  pattern Y = X
 {- 133 -}  {-# COMPLETE Y #-}
 {- 134 -}
 {- 135 -}  f1 :: S -> Int
 {- 136 -}  f1 Y = 1
 {- 137 -}  f1 _ = 2
 {- 138 -}
 {- 139 -}  -- f1: no warnings
 {- 140 -}
 {- 141 -}  f2 :: S -> Int
 {- 142 -}  f2 X = 1
 {- 143 -}  f2 _ = 2
 {- 144 -}
 {- 145 -}  --  M.hs:143:1: warning: [-Woverlapping-patterns]
 {- 146 -}  --      Pattern match is redundant
 {- 147 -}  --      In an equation for `f2': f2 _ = ...
 {- 148 -}  --      |
 {- 149 -}  --  143 | {- 143 -}  f2 _ = 2
 {- 150 -}  --      |            ^^^^^^^^
 {- 151 -}
 {- 152 -}  f3 :: S -> Int
 {- 153 -}  f3 Y = 0
 {- 154 -}  f3 X = 1
 {- 155 -}  f3 _ = 2
 {- 156 -}
 {- 157 -}  -- f3: no warnings
 {- 158 -}
 {- 159 -}  data S' = X'
 {- 160 -}
 {- 161 -}  pattern Y' :: S'
 {- 162 -}  pattern Y' = X'
 {- 163 -}  -- no COMPLETE pragma
 {- 164 -}
 {- 165 -}  f3' :: S' -> Int
 {- 166 -}  f3' Y' = 1
 {- 167 -}  f3' X' = 0
 {- 168 -}  f3' _ = 2
 {- 169 -}
 {- 170 -}  --  M.hs:168:1: warning: [-Woverlapping-patterns]
 {- 171 -}  --      Pattern match is redundant
 {- 172 -}  --      In an equation for f3': f3' _ = ...
 {- 173 -}  --      |
 {- 174 -}  --  168 | {- 168 -}  f3' _ = 2
 {- 175 -}  --      |            ^^^^^^^^^
 }}}

 In particular: the warning for line 18 should probably be a warning for
 line 19, and there should be a similar warning for line 31. `g3` extends
 `g2` in a ridiculous way still without generating any warnings. `g3'`
 demonstrates the warnings one should expect.

 The `f` functions are perhaps a bit redundant, but I wanted to include a
 smaller datatype.

 I’m not sure if this is easily fixable, since I’m having doubts, that
 COMPLETE pragmas give enough information for generating good overlapping-
 patterns warnings. I didn’t think this matter through in detail, but,
 well, maybe it’s not that important to have this all that sophisticated
 anyways, since for example guards won’t give overlapping-patterns warnings
 either. But at least (IMO) it’d be nice to keep the warnings about the
 normal constructor’s patterns even when they’re mixed with pattern
 synonyms that have a COMPLETE pragma.

 Even further, I would always expect overlapping-patterns warnings when a
 pattern is simply duplicated and probably always if any additional pattern
 follows a complete listing of everything in a COMPLETE group. And there’s
 probably lots of cases one could consider naturally suggesting a warning;
 maybe someone can find a good principle/algorithm to use here. Going
 further, to prevent COMPLETE pragma setting that always give an
 overlapping-patterns or incomplete-patterns warnings, one could even
 consider warning directly at a COMPLETE pragma when it’s a strict subset
 of an existing COMPLETE group.

 By the way, my actual goal while finding this bug was to describe another
 (maybe) bug, which is that the incomplete-patterns warnings can suggest
 missing pattern synonyms that are not even in scope, which seems not very
 neat in some cases. In case someone really wants to rework all these
 warnings, I can make a separate ticket or give details on such a non-neat
 case that here.

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


More information about the ghc-tickets mailing list