[GHC] #12549: Panic on ":t datatypeName"

GHC ghc-devs at haskell.org
Mon Nov 21 05:38:42 UTC 2016


#12549: Panic on ":t datatypeName"
---------------------------------+--------------------------------------
        Reporter:  johnleo       |                Owner:  johnleo
            Type:  bug           |               Status:  new
        Priority:  normal        |            Milestone:
       Component:  Compiler      |              Version:  8.1
      Resolution:                |             Keywords:
Operating System:  MacOS X       |         Architecture:  x86_64 (amd64)
 Type of failure:  None/Unknown  |            Test Case:
      Blocked By:                |             Blocking:
 Related Tickets:                |  Differential Rev(s):
       Wiki Page:                |
---------------------------------+--------------------------------------

Comment (by johnleo):

 Thank you, that is indeed very helpful.  I agree that comment in
 `newMetaTyVars` is very likely
 incorrect and the source of bugs.  However I believe the panic that occurs
 in this case is
 actually a different problem.  First note that the actual substitutions of
 the kinds that results
 in `∀ (ba ∷ kj) (cb ∷ kk). al ba cb` happens earlier, on the line
 {{{
 ; (wrap2, rho2) <- deeplyInstantiate orig (substTyUnchecked subst rho)
 }}}
 of `deeplyInstantiate`.  Note that the substitution was already unchecked
 there, likely due to
 the problem you mention (as well as perhaps other problems).  The panic in
 the line
 {{{
 kind   = substTy subst (tyVarKind tv)
 }}}
 that happens later seems unrelated to the substitution invariant.  At this
 point the kinds
 have already been substituted, so it is trying to do the substitution `kk
 -> kk`, which
 in fact satisfies the invariant.  The code line above is very suspicious
 to me--I'm not sure why
 any substitution for the kind is being attempted.  Why not just `kind =
 tyVarKind tv`?
 If all kinds must be specified before the types that use them (and I
 assume that is checked
 somewhere earlier) then the kind substitution must have already been
 happened.

 The problem seems to be that `subst` here is the substitution for the type
 variable, but
 we pass in the kind variable as the second argument to `substTy` which
 confuses
 `checkValidSubst`.  This can be seen from the values printed out by the
 assert (here with
 the full names).
 {{{
   in_scope InScope {k_a12j b_a12p}
   tenv [a11a :-> b_a12p[tau:2]]
   cenv []
   tys [k_a12k[tau:2]]
   cos []
   needInScope [a12k :-> k_a12k[tau:2]]
 }}}
 The substitution being attempted is `kk -> kk` but `tenv` contains the `ba
 -> bp` substitution.
 So in the lines
 {{{
   needInScope = (tyCoVarsOfTypes tys `unionVarSet` tyCoVarsOfCos cos)
                   `delListFromUFM_Directly` substDomain
 }}}
 of `checkValidSubst` the `substDomain` (of `tenv`) is getting removed from
 `needInScope` but it is the
 wrong domain--it should be `kk`, not `ba`.

 Anyway it seems there seem to be a lot of problems with this code, and
 it's certainly worth
 going through and cleaning up, but again I'd appreciate some perspective
 to make sure I'm
 not breaking more than I fix.

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


More information about the ghc-tickets mailing list