[GHC] #15142: GHC HEAD regression: tcTyVarDetails

GHC ghc-devs at haskell.org
Tue May 22 21:14:05 UTC 2018


#15142: GHC HEAD regression: tcTyVarDetails
-------------------------------------+-------------------------------------
        Reporter:  RyanGlScott       |                Owner:  (none)
            Type:  bug               |               Status:  new
        Priority:  highest           |            Milestone:  8.6.1
       Component:  Compiler (Type    |              Version:  8.5
  checker)                           |             Keywords:  TypeInType,
      Resolution:                    |  TypeFamilies
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):
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by simonpj):

 Oh dear, there are lots of thigs wrong here.  I looked at
 {{{
 {-# LANGUAGE MultiParamTypeClasses #-}
 {-# LANGUAGE TypeFamilies #-}
 {-# LANGUAGE TypeInType #-}
 module Bug where

 import Data.Kind

 class C (a :: Type) (b :: k) where
   type T b
 }}}


 * First, `C` has a CUSK.  But does `T`?  Well `hsCeclHasCusk` reports True
 for the class decl, without even looking at `T`.  This seems wrong.

 * `C` has a CUSK, but in `class C (a :: Type) (b :: k)`, I'm not sore how
 we get to know that `k :: Type`.   Yet, without that `C` would not ahve a
 CUSK.

 * `getInitialKinds` returns this very bogus kind for `T`:
 {{{
 kcTyClGroup: initial kinds
   C :: forall k. * -> k -> Constraint
   T :: forall (k :: k_aWH[tau:1]) (co :: k_aWH[tau:1] GHC.Prim.~# *).
          (k |> {co_aWL}) -> *
 }}}

 * What is that `co` binder?  It's created in the mysterious `kcLHsQTyVars`
 function, which does something very like `quantifyTyVars`, but by steam.
 It uses `tyCoVarsOfTypeWellScoped`, but neglects to filter out coercion
 variables; hence the bugos quantification over `co_aWL`.

 ------------------
 I'm reluctant to reach for a quick fix here.  It all looks very dodgy to
 me.  The `getInitialKinds` function, which is the bit misbehaving here,
 should be very simple:

 * For CUSKs, the idea is that it's a ''complete, user-specified kind'',
 just like a top-level type signature for a term variable.  II expect to do
 something very akin to `tcHsSigType`: that is, type-check the kind, solve
 any constraints that arise, and kind-generalise the result.  It's made a
 bit trickier by the fact that instead of a `LHsSigType` like `forall a.
 a->a` we have some `LHsQTyVars` like `data T (a :: k) (b :: *)`.  But it's
 basically all one kind signature, pretty much the same as `forall (a::k)
 (b::*). blah`

 * For non-CUSKs, we can safely simply make `T :: kappa`, without looking
 at the declaration at all!  We can perhaps save ourselves a bit of
 fruitless unification by seeing that if its `data T (a :: ...) (b :: ...)`
 then we can make `T :: kappa1 -> kappa2 -> *`.  But we don't have to look
 into those "..." parts; that's going to happen later.  No
 `solveEqualities` for non-CUSKs.

 * Associated types should not be allowed to mess things up!  They must be
 treated as CUSK-ish only if they are in fact complete. Fundamentally, the
 same rules should apply: every type variable should be annotated.  But
 maybe we can make an exception for variables from the parent class, if the
 parent class has a CUSK.  Eg
 {{{
 class C (a :: *) where
   type F a (b :: * -> *) :: *
 }}}
   Here perhaps we can allow `a` not to be annotated in `F`'s defn because
 it comes from `C` which itself has a CUSK.

 The present code does not do this, and it's buggy as this ticket shows.
 Let's discuss.

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


More information about the ghc-tickets mailing list