
#15009: Float equalities past local equalities -------------------------------------+------------------------------------- Reporter: goldfire | Owner: (none) Type: feature request | Status: closed Priority: normal | Milestone: 8.4.3 Component: Compiler | Version: 8.2.2 Resolution: fixed | Keywords: Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: gadt/T15009 Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Comment (by nfrisby): If I correctly understand what the "inert substitution" is, then I think I can summarize the intent of my draft rule as follows.
Let dis[i] be the domain of the inert substitution active in the wanteds of TcLevel i. We can safely float a wanted CTyEqCan {{{w : alpha[L] ~ <t>}}} from level K to level L if dis[K] can never change (which implies dis[L] can never change -- ie no CTyEqCan might flip to reveal a new LHS) and if dis[K] - dis[L] does not include any metavars, any flattening skolems, or any skolems of level <= L.
-- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/15009#comment:21 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler