
#15568: Kind variables in type family aren't quantified in toposorted order -------------------------------------+------------------------------------- Reporter: RyanGlScott | Owner: (none) Type: bug | Status: new Priority: normal | Milestone: 8.8.1 Component: Compiler | Version: 8.5 Resolution: | Keywords: | TypeApplications, TypeFamilies Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Comment (by RyanGlScott): I figured out what caused this regression. The primary culprit is commit fa29df02a1b0b926afb2525a258172dcbf0ea460 (Refactor ConDecl: Trac #14529). In particular, this commit made a rather suspicious-looking change to `bindHsQTyVars`: {{{#!diff diff --git a/compiler/rename/RnTypes.hs b/compiler/rename/RnTypes.hs index dd66cd3..727744d 100644 --- a/compiler/rename/RnTypes.hs +++ b/compiler/rename/RnTypes.hs @@ -898,23 +905,24 @@ bindHsQTyVars doc mb_in_doc mb_assoc body_kv_occs hsq_bndrs thing_inside ; let -- See Note [bindHsQTyVars examples] for what -- all these various things are doing - bndrs, kv_occs, implicit_bndr_kvs, - implicit_body_kvs, implicit_kvs :: [Located RdrName] - bndrs = map hsLTyVarLocName hs_tv_bndrs - kv_occs = body_kv_occs ++ bndr_kv_occs - implicit_bndr_kvs = filter_occs rdr_env bndrs bndr_kv_occs - implicit_body_kvs = filter_occs rdr_env (implicit_bndr_kvs ++ bndrs) body_kv_occs + bndrs, kv_occs, implicit_kvs :: [Located RdrName] + bndrs = map hsLTyVarLocName hs_tv_bndrs + kv_occs = nubL (body_kv_occs ++ bndr_kv_occs) + implicit_kvs = filter_occs rdr_env bndrs kv_occs -- Deleting bndrs: See Note [Kind- variable ordering] - implicit_kvs = implicit_bndr_kvs ++ implicit_body_kvs - }}} The value of `implicit_kvs` is what's important here, since it determines the order in which kind variables appear in type family kind signatures. In the commit before, we had: {{{#!hs implicit_kvs = implicit_bndr_kvs ++ implicit_body_kvs }}} Which makes sense, as you'd expect the binder kind variables to appear before any kind variables from the body. But after that commit, we now have: {{{#!hs kv_occs = nubL (body_kv_occs ++ bndr_kv_occs) implicit_kvs = filter_occs rdr_env bndrs kv_occs }}} Now, we're putting all of the body kind variables before the binder ones! (Note that the first commit in which you can actually see the `forall k j.` order instead of the old `forall j k.` order is actually 12794287174146f982257cdeffd491e3e23838dc (`Quantify unfixed kind variables in CUSKs`), but that's only because that commit changed the way kind variables were quantified to use `quantifyTyVars` instead of `tyCoVarsOfTypeWellScoped`, causing GHC to be more sensitive to the order of the kind variables in `implicit_kvs`.) I think fixing this is a simple matter of defining `kv_occs = nubL (bndr_kv_occs ++ body_kv_occs)` instead. Patch incoming. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/15568#comment:1 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler