 
            #15343: Implicitly quantifying a kind variable causes GHC 8.6 to panic
(coercionKind)
-------------------------------------+-------------------------------------
           Reporter:  RyanGlScott    |             Owner:  (none)
               Type:  bug            |            Status:  new
           Priority:  high           |         Milestone:  8.6.1
          Component:  Compiler       |           Version:  8.5
  (Type checker)                     |
           Keywords:  TypeInType     |  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:
-------------------------------------+-------------------------------------
 The following program panics on GHC 8.6 and later:
 {{{#!hs
 {-# LANGUAGE AllowAmbiguousTypes #-}
 {-# LANGUAGE GADTs #-}
 {-# LANGUAGE RankNTypes #-}
 {-# LANGUAGE ScopedTypeVariables #-}
 {-# LANGUAGE TypeApplications #-}
 {-# LANGUAGE TypeFamilies #-}
 {-# LANGUAGE TypeInType #-}
 {-# LANGUAGE TypeOperators #-}
 module Bug where
 import Data.Kind
 import Data.Type.Equality
 data family Sing :: forall k. k -> Type
 data SomeSing :: Type -> Type where
   SomeSing :: Sing (a :: k) -> SomeSing k
 class SingKind k where
   type Demote k :: Type
   fromSing :: Sing (a :: k) -> Demote k
   toSing   :: Demote k -> SomeSing k
 data instance Sing (z :: a :~~: b) where
   SHRefl :: Sing HRefl
 instance SingKind (a :~~: b) where
   type Demote (a :~~: b) = a :~~: b
   fromSing SHRefl = HRefl
   toSing HRefl    = SomeSing SHRefl
 data TyFun :: Type -> Type -> Type
 type a ~> b = TyFun a b -> Type
 infixr 0 ~>
 type family Apply (f :: k1 ~> k2) (x :: k1) :: k2
 (~>:~~:) :: forall (j :: Type) (k :: Type) (a :: j) (b :: k)
                    (p :: forall (z :: Type) (y :: z). (a :~~: y) ~> Type)
                    (r :: a :~~: b).
             Sing r
          -> Apply p HRefl
          -> Apply p r
 (~>:~~:) SHRefl pHRefl = pHRefl
 type family Why (a :: j) (e :: a :~~: (y :: z)) :: Type where
   Why a (_ :: a :~~: y)  = y :~~: a
 data    WhySym (a :: j) :: forall   (y :: z). (a :~~: y) ~> Type
 -- data WhySym (a :: j) :: forall z (y :: z). (a :~~: y) ~> Type
 -- The version above does NOT panic
 type instance Apply (WhySym a) e = Why a e
 hsym :: forall (j :: Type) (k :: Type) (a :: j) (b :: k).
         a :~~: b -> b :~~: a
 hsym eq = case toSing eq of
             SomeSing (singEq :: Sing r) ->
               (~>:~~:) @j @k @a @b @(WhySym a) @r singEq HRefl
 }}}
 {{{
 $ /opt/ghc/8.6.1/bin/ghc Bug.hs
 [1 of 1] Compiling Bug              ( Bug.hs, Bug.o )
 ghc: panic! (the 'impossible' happened)
   (GHC version 8.6.0.20180627 for x86_64-unknown-linux):
         coercionKind
   Nth:3
       (Inst {co_a1jI} (Coh