Repository : ssh://darcs.haskell.org//srv/darcs/ghc

On branch  : supercompiler

http://hackage.haskell.org/trac/ghc/changeset/f4cc350c5a55caa9734e8532b3cc7186024c67b0

>---------------------------------------------------------------

commit f4cc350c5a55caa9734e8532b3cc7186024c67b0
Author: Max Bolingbroke <batterseapo...@hotmail.com>
Date:   Fri Apr 27 10:45:06 2012 +0100

    Correct the types of generalised term binders

>---------------------------------------------------------------

 compiler/supercompile/Supercompile/Drive/MSG.hs |   16 ++++++++++------
 1 files changed, 10 insertions(+), 6 deletions(-)

diff --git a/compiler/supercompile/Supercompile/Drive/MSG.hs 
b/compiler/supercompile/Supercompile/Drive/MSG.hs
index 67503d2..41961d0 100644
--- a/compiler/supercompile/Supercompile/Drive/MSG.hs
+++ b/compiler/supercompile/Supercompile/Drive/MSG.hs
@@ -964,14 +964,18 @@ msgPureHeap mm rn2 msg_e msg_s (Heap init_h_l init_ids_l) 
(Heap init_h_r init_id
       = go rn_l rn_r used_l used_r (M.insert x_l (internallyBound (renamedTerm 
e_l)) init_h_l) init_h_r (Heap h_l ids_l') (Heap h_r ids_r) h (msg_s { 
msgPending = (x_common, PendingVar x_l x_r):rest })
       -}
 
-      -- Match binders themselves, but in this case we can't reuse 
msgIdCoVarBndrExtras, which is annoying :-(. We rely on the fact that x_common 
always has no extra info.
-      -- NB: binder matching here never fails because type matching never 
fails, and x_common is guaranteed created with no extra info.
       | msg_s <- msg_s { msgPending = rest }
       -- We already know the terms don't match so we are going to generalise
-      = prod (do let (ids_l', x_common_l) = uniqAway' ids_l x_common
-                     (ids_r', x_common_r) = uniqAway' ids_r x_common
-                 (used_l', h_l') <- sucks init_h_l k_bvs_l (M.insert 
x_common_l (internallyBound (renamedTerm e_l)) h_l) used_l (annedTermFreeVars 
e_l)
-                 (used_r', h_r') <- sucks init_h_r k_bvs_l (M.insert 
x_common_r (internallyBound (renamedTerm e_r)) h_r) used_r (annedTermFreeVars 
e_r)
+      --
+      -- NB: we rely on the fact that x_common always has no extra info here, 
because we need to effectively apply the left/right
+      -- hand side renaming to the Id extra info. If we don't then we end up 
having binders like (x :: genty) in the left/right heaps
+      -- when the left/right renaming contains a mapping like (genty |-> Int).
+      --
+      -- We can just barely get away with this in the type/coercion cases 
because the types/coercions don't get bindings per-se, they are just added to 
the renaming
+      = prod (do let (ids_l', x_common_l) = uniqAway' ids_l (x_common 
`setVarType` termType e_l)
+                     (ids_r', x_common_r) = uniqAway' ids_r (x_common 
`setVarType` termType e_r)
+                 (used_l', h_l') <- sucks init_h_l k_bvs_l (M.insert 
x_common_l (internallyBound (renamedTerm e_l)) h_l) used_l (annedTermFreeVars 
e_l `unionVarSet` varBndrFreeVars x_common_l)
+                 (used_r', h_r') <- sucks init_h_r k_bvs_l (M.insert 
x_common_r (internallyBound (renamedTerm e_r)) h_r) used_r (annedTermFreeVars 
e_r `unionVarSet` varBndrFreeVars x_common_r)
                  return (go (insertIdRenaming rn_l x_common x_common_l) 
(insertIdRenaming rn_r x_common x_common_r) used_l' used_r' init_h_l init_h_r
                             (Heap h_l' ids_l') (Heap h_r' ids_r') (M.insert 
x_common generalised h) msg_s))
     go rn_l rn_r used_l used_r init_h_l init_h_r (Heap h_l ids_l) (Heap h_r 
ids_r) h msg_s@(MSGState { msgPending = ((a_common, PendingType ty_l 
ty_r):rest) })



_______________________________________________
Cvs-ghc mailing list
Cvs-ghc@haskell.org
http://www.haskell.org/mailman/listinfo/cvs-ghc

Reply via email to