[GHC] #11984: Pattern match incompleteness / inaccessibility discrepancy

GHC ghc-devs at haskell.org
Thu Feb 22 10:17:20 UTC 2018


#11984: Pattern match incompleteness / inaccessibility discrepancy
-------------------------------------+-------------------------------------
        Reporter:  goldfire          |                Owner:  (none)
            Type:  bug               |               Status:  patch
        Priority:  normal            |            Milestone:
       Component:  Compiler          |              Version:  8.1
      Resolution:                    |             Keywords:
                                     |  PatternMatchWarnings
Operating System:  Unknown/Multiple  |         Architecture:
                                     |  Unknown/Multiple
 Type of failure:  None/Unknown      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:  #14098            |  Differential Rev(s):  Phab:D4434
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by simonpj):

 Thanks Ryan. You've nailed the problem.

 I think your fix will work.  And your long Note is great.

 But the particular solution smells wrong.

 I think the real bug is in the "ConCon" case of `pmcheckHd`, which looks
 like this
 {{{
 pmcheckHd ( p@(PmCon {pm_con_con = c1, pm_con_args = args1})) ps guards
           (va@(PmCon {pm_con_con = c2, pm_con_args = args2})) (ValVec vva
 delta)
   | c1 /= c2  =
     return (usimple [ValVec (va:vva) delta])
   | otherwise = kcon c1 (pm_con_arg_tys p) (pm_con_tvs p) (pm_con_dicts p)
                 <$> pmcheckI (args1 ++ ps) guards (ValVec (args2 ++ vva)
 delta)
 }}}
 Notice that it ''totally ignores'' the existential `pm_con_tvs` of the two
 arguments.
 If the two aren't ''identical'' we'll get failure in precisely the way you
 diagnosed.

 I think your fix arranges that they are always identical.  But even if we
 adopt
 your approach, we should add an ASSERT (with explanation) on the "ConCon"
 case.

 More fundamentally, how can we be sure that the assertion holds?  I'm not
 sure.
 An alternative (and more solid) approach would be to fix the bug in
 ConCon.  How?
 Well, looking back at the paper, if we have
 {{{
 pmcheckHd ( p@(PmCon {pm_con_con = c1, pm_con_tvs = tvs1, pm_con_args =
 args1})) ps guards
           (va@(PmCon {pm_con_con = c2, pm_con_tvs = tvs2, pm_con_args =
 args2})) (ValVec vva delta)
 }}}
 then we want to add equalities to `Delta` that say `tvs1 = tvs2`.  And
 that should be dead easy to do.

 If a corresponding pair `tv1` and `tv2` are already equal, no need to
 geneate the equality.

 Now the `mkOneCOnFull` fix turns into mere optimisation, one that makes it
 more likely that the equalities will hold.

 Does that makes sense?

 I'd be content with the ASSERT; that's the shortest path to a fix.  But at
 least
 refer to this comment if so.

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


More information about the ghc-tickets mailing list