[GHC] #12083: ghc-8.0.1-rc4: tyConRoles sees a TcTyCon

GHC ghc-devs at haskell.org
Thu May 26 00:35:25 UTC 2016


#12083: ghc-8.0.1-rc4: tyConRoles sees a TcTyCon
-------------------------------------+-------------------------------------
        Reporter:  _deepfire         |                Owner:
            Type:  bug               |               Status:  new
        Priority:  normal            |            Milestone:
       Component:  Compiler (Type    |              Version:  8.0.1-rc4
  checker)                           |
      Resolution:                    |             Keywords:
Operating System:  Unknown/Multiple  |         Architecture:
 Type of failure:  Compile-time      |  Unknown/Multiple
  crash                              |            Test Case:  Yes.
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by goldfire):

 Urgh. I know what is going on here.

 The problem is that `Constrd` is bogus because its right-hand side is
 constrained and we haven't enabled the right extensions. The validity
 check fails. Regardless, GHC tries to continue to check the remaining
 declarations. To do this, GHC replaces `Constrd` with a stubbed-out
 `TyCon`, as explained in this note:

 {{{
 {- Note [Recover from validity error]
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 We recover from a validity error in a type or class, which allows us
 to report multiple validity errors. In the failure case we return a
 TyCon of the right kind, but with no interesting behaviour
 (makeTyConAbstract). Why?  Suppose we have
    type T a = Fun
 where Fun is a type family of arity 1.  The RHS is invalid, but we
 want to go on checking validity of subsequent type declarations.
 So we replace T with an abstract TyCon which will do no harm.
 See indexed-types/should_fail/BadSock and Trac #10896

 Painfully, though, we *don't* want to do this for classes.
 Consider tcfail041:
    class (?x::Int) => C a where ...
    instance C Int
 The class is invalid because of the superclass constraint.  But
 we still want it to look like a /class/, else the instance bleats
 that the instance is mal-formed because it hasn't got a class in
 the head.
 -}
 }}}

 Because of the changes caused by `TypeInType`, the solver now can run
 while checking type declarations, and the solver ends up seeing the
 stubbed-out `TyCon`, causing the panic.

 What should be done about this? Here are some ideas:
 1. Some up with a way to deal with the problem described in the Note
 without fully stubbing out the `TyCon`. For example, the bogus `T` in the
 note could be transmuted to a `type family T a` with no instances.

 2. If there is a validity error in one mutually-recursive group, don't
 proceed to the next group. This will reduce the number of errors reported
 in one go.

 3. Enlarge the stubbed-out `TyCon`s to be able to make it through the
 solver without panicking. This shouldn't be too hard, but it seems like
 the wrong direction of travel.

 In any case, I'm not assigning the ticket to myself, because I make no
 guarantees about my ability to finish this work. I just saw that `TcTyCon`
 (which is the current form of a stubbed-out `TyCon`) was causing trouble
 so I thought I'd take a look.

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


More information about the ghc-tickets mailing list