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

On branch  : ghc-kinds

http://hackage.haskell.org/trac/ghc/changeset/66d3aa0eb90df184c934ec10e65459eb48b9ff40

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

commit 66d3aa0eb90df184c934ec10e65459eb48b9ff40
Author: Julien Cretin <g...@ia0.eu>
Date:   Thu Sep 22 19:48:43 2011 +0200

    unify kinds in the pure unifier

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

 compiler/basicTypes/Var.lhs       |    4 +-
 compiler/typecheck/TcRnDriver.lhs |    1 +
 compiler/types/Unify.lhs          |   41 +++++++++++++++++++-----------------
 3 files changed, 25 insertions(+), 21 deletions(-)

diff --git a/compiler/basicTypes/Var.lhs b/compiler/basicTypes/Var.lhs
index a87b4b1..c8643fb 100644
--- a/compiler/basicTypes/Var.lhs
+++ b/compiler/basicTypes/Var.lhs
@@ -190,8 +190,8 @@ After CoreTidy, top-level LocalIds are turned into GlobalIds
 
 \begin{code}
 instance Outputable Var where
-  ppr var = ppr (varName var) <+> ifPprDebug (brackets (ppr_debug var))
-            <+> text ":: (" <+> ppr (tyVarKind var) <+> text ")"  -- 
IA0_DEBUG: remove this line
+  ppr var = ifPprDebug (text "(") <+> ppr (varName var) <+> ifPprDebug 
(brackets (ppr_debug var))
+            <+> ifPprDebug (text "::" <+> ppr (tyVarKind var) <+> text ")")
 
 ppr_debug :: Var -> SDoc
 ppr_debug (TyVar {})                           = ptext (sLit "tv")
diff --git a/compiler/typecheck/TcRnDriver.lhs 
b/compiler/typecheck/TcRnDriver.lhs
index 41d4ccc..de31e29 100644
--- a/compiler/typecheck/TcRnDriver.lhs
+++ b/compiler/typecheck/TcRnDriver.lhs
@@ -951,6 +951,7 @@ tcTopSrcDecls boot_details
                                  , tcg_vects = tcg_vects tcg_env ++ vects
                                  , tcg_anns  = tcg_anns tcg_env ++ annotations
                                  , tcg_fords = tcg_fords tcg_env ++ foe_decls 
++ fi_decls } } ;
+
         return (tcg_env', tcl_env)
     }}}}}}
 \end{code}
diff --git a/compiler/types/Unify.lhs b/compiler/types/Unify.lhs
index f9d0b53..52e03ef 100644
--- a/compiler/types/Unify.lhs
+++ b/compiler/types/Unify.lhs
@@ -508,26 +508,29 @@ uUnrefined subst tv1 ty2 (TyVarTy tv2)
   | Just ty' <- lookupVarEnv subst tv2
   = uUnrefined subst tv1 ty' ty'
 
+  | otherwise
   -- So both are unrefined; next, see if the kinds force the direction
-  -- IA0_TODO: we might need to call unify instead
-  | eqKind k1 k2       -- Can update either; so check the bind-flags
-  = do { b1 <- tvBindFlag tv1
-       ; b2 <- tvBindFlag tv2
-       ; case (b1,b2) of
-           (BindMe, _)          -> bind tv1 ty2
-           (Skolem, Skolem)     -> failWith (misMatch ty1 ty2)
-           (Skolem, _)          -> bind tv2 ty1
-       }
-
-  | k1 `isSubKind` k2 = bindTv subst tv2 ty1  -- Must update tv2
-  | k2 `isSubKind` k1 = bindTv subst tv1 ty2  -- Must update tv1
-
-  | otherwise = failWith (kindMisMatch tv1 ty2)
-  where
-    ty1 = TyVarTy tv1
-    k1 = tyVarKind tv1
-    k2 = tyVarKind tv2
-    bind tv ty = return $ extendVarEnv subst tv ty
+  = case (k1_sub_k2, k2_sub_k1) of
+        (True,  True)  -> choose subst
+        (True,  False) -> bindTv subst tv2 ty1
+        (False, True)  -> bindTv subst tv1 ty2
+        (False, False) -> do
+            { subst' <- unify subst k1 k2
+            ; choose subst' }
+  where subst_kind = mkTvSubst (mkInScopeSet (tyVarsOfTypes [k1,k2])) subst
+        k1 = substTy subst_kind (tyVarKind tv1)
+        k2 = substTy subst_kind (tyVarKind tv2)
+        k1_sub_k2 = k1 `isSubKind` k2
+        k2_sub_k1 = k2 `isSubKind` k1
+        ty1 = TyVarTy tv1
+        bind subst tv ty = return $ extendVarEnv subst tv ty
+        choose subst = do
+             { b1 <- tvBindFlag tv1
+             ; b2 <- tvBindFlag tv2
+             ; case (b1, b2) of
+                 (BindMe, _)         -> bind subst tv1 ty2
+                 (Skolem, Skolem)    -> failWith (misMatch ty1 ty2)
+                 (Skolem, _)         -> bind subst tv2 ty1 }
 
 uUnrefined subst tv1 ty2 ty2'  -- ty2 is not a type variable
   | tv1 `elemVarSet` niSubstTvSet subst (tyVarsOfType ty2')



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

Reply via email to