[GHC] #14135: PatternSynonyms regression in GHC HEAD (expectJust mkOneConFull)

GHC ghc-devs at haskell.org
Thu Sep 21 08:41:15 UTC 2017


#14135: PatternSynonyms regression in GHC HEAD (expectJust mkOneConFull)
-------------------------------------+-------------------------------------
        Reporter:  RyanGlScott       |                Owner:  carlostome
            Type:  bug               |               Status:  new
        Priority:  highest           |            Milestone:  8.4.1
       Component:  Compiler          |              Version:  8.3
      Resolution:                    |             Keywords:
                                     |  PatternSynonyms
Operating System:  Unknown/Multiple  |         Architecture:
 Type of failure:  Compile-time      |  Unknown/Multiple
  crash or panic                     |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):  Phab:D3981
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by simonpj):

 OK I can see what is happening here.  The trouble is with the COMPLETE
 pragma (again!).

 Suppose we'd written
 {{{
 f :: Foo a -> a
 f (Foo1 x)   = x
 f (MyFoo2 y) = y
 }}}
 This definition is rejected as ill-typed:
 {{{
 T14135.hs:13:4: error:
     * Couldn't match type `a' with `Int'
       `a' is a rigid type variable bound by
         the type signature for:
           f :: forall a. Foo a -> a
         at T14135.hs:11:1-15
       Expected type: Foo a
         Actual type: Foo Int
 }}}
 Reason: the pattern synonym `MyFoo2` demands that its scrutinee has type
 `Foo Int`.  This is unlike a GADT, whose data constructors can have a
 return type `Foo Int` but which can match a scrutinee of type `Foo a`.
 It's a conscious design choice, described in the user manual (I hope). See
 `Note [Pattern synonym result type]` in `PatSyn`.

 Now, the overlap checker, when looking for missing patterns, effectively
 adds that extra equation.  But the extra equation is ill-typed which
 crashes the overlap checker.   (So yes, I think the `tcMatchTy` is fine;
 it's relying on the scrutinee having the right type.)

 So what are we to make of `{-# COMPLETE Foo1, MyFoo2 #-}`?  The simplest
 thing to do is to insist that all the constructors in a COMPLETE pragma
 match the same type of scrutinee, where

 * A constructor `K` declared thus
 {{{
 data T a b where
   K :: ....
 }}}
   matches a scrutinee of type `T a b` (NB: NOT the return type in K's
 signature which for a GADT might be `T Int Bool`)

 * A constructor `K` declared in a `data instance`
 {{{
 data instance T ty1 ty2 where
   K :: ....
 }}}
   matches a scrutinee of type `T ty1 ty2`.  (NB: again, not the return
 type in K's signature which may an instance of `K ty1 ty2`)

 * A constructor `K` declared in a pattern synonym
 {{{
 pattern K :: .... -> T ty1 ty2
 }}}
   matches a scrutinee of type `T ty1 ty2`.

 If we did this check when dealing with the COMPLETE pragma, I think that's
 solve this crash.

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


More information about the ghc-tickets mailing list