Don't import FastString in HsVersions.h
[ghc-hetmet.git] / compiler / typecheck / TcGadt.lhs
index 4cd7e00..e45d6bd 100644 (file)
 %************************************************************************
 
 \begin{code}
+{-# OPTIONS -w #-}
+-- The above warning supression flag is a temporary kludge.
+-- While working on this module you are encouraged to remove it and fix
+-- any warnings in the module. See
+--     http://hackage.haskell.org/trac/ghc/wiki/Commentary/CodingStyle#Warnings
+-- for details
+
 module TcGadt (
        Refinement, emptyRefinement, isEmptyRefinement, 
        gadtRefine, 
@@ -24,7 +31,6 @@ import Coercion
 import Type
 
 import TypeRep
-import DataCon
 import Var
 import VarEnv
 import VarSet
@@ -33,11 +39,9 @@ import Maybes
 import Control.Monad
 import Outputable
 import TcType
-
-#ifdef DEBUG
 import Unique
 import UniqFM
-#endif
+import FastString
 \end{code}
 
 
@@ -234,11 +238,15 @@ fixTvCoEnv in_scope env
       -- then use transitivity with the original coercion
 
 -----------------------------
+-- XXX Can we do this more nicely, by exploiting laziness?
+-- Or avoid needing it in the first place?
 fixTvSubstEnv :: InScopeSet -> TvSubstEnv -> TvSubstEnv
-fixTvSubstEnv in_scope env
-  = fixpt 
+fixTvSubstEnv in_scope env = f env
   where
-    fixpt = mapVarEnv (substTy (mkTvSubst in_scope fixpt)) env
+    f e = let e' = mapUFM (substTy (mkTvSubst in_scope e)) e
+          in if and $ eltsUFM $ intersectUFM_C tcEqType e e'
+             then e
+             else f e'
 
 ----------------------------
 tryToBind :: TyVarSet -> TyVar -> BindFlag
@@ -255,7 +263,6 @@ tryToBind tv_set tv | tv `elemVarSet` tv_set = BindMe
 %************************************************************************
 
 \begin{code}
-#ifdef DEBUG
 badReftElts :: InternalReft -> [(Unique, (Coercion,Type))]
 -- Return the BAD elements of the refinement
 -- Should be empty; used in asserions only
@@ -268,7 +275,6 @@ badReftElts env
                     | otherwise = False
        where
          (ty1,ty2) = coercionKind co
-#endif
 
 emptyInternalReft :: InternalReft
 emptyInternalReft = emptyVarEnv