Allow type families to use GADT syntax (and be GADTs)
[ghc-hetmet.git] / compiler / rename / RnBinds.lhs
index a921924..23a22c9 100644 (file)
@@ -312,8 +312,6 @@ rnValBindsRHSGen :: (FreeVars -> FreeVars)  -- for trimming free var sets
 
 rnValBindsRHSGen trim bound_names (ValBindsIn mbinds sigs) = do
    -- rename the sigs
-   env <- getGblEnv
-   traceRn (ptext (sLit "Rename sigs") <+> ppr (tcg_rdr_env env))
    sigs' <- renameSigs (Just (mkNameSet bound_names)) okBindSig sigs
    -- rename the RHSes
    binds_w_dus <- mapBagM (rnBind (mkSigTvFn sigs') trim) mbinds
@@ -497,7 +495,7 @@ rnBind _ trim (L loc (PatBind { pat_lhs = pat,
                -- No scoped type variables for pattern bindings
        ; let fvs' = trim fvs
 
-       ; fvs' `seq`
+       ; fvs' `seq` -- See Note [Free-variable space leak]
       return (L loc (PatBind { pat_lhs = pat,
                                   pat_rhs = grhss', 
                                     pat_rhs_ty = placeHolderType, 
@@ -523,7 +521,7 @@ rnBind sig_fn
 
        ; checkPrecMatch inf plain_name matches'
 
-       ; fvs' `seq`
+       ; fvs' `seq` -- See Note [Free-variable space leak]
       return (L loc (FunBind { fun_id = name,
                                   fun_infix = inf, 
                                   fun_matches = matches',
@@ -534,7 +532,20 @@ rnBind sig_fn
       }
 
 rnBind _ _ b = pprPanic "rnBind" (ppr b)
-               
+
+{-
+Note [Free-variable space leak]
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+We have
+    fvs' = trim fvs
+and we seq fvs' before turning it as part of a record.
+
+The reason is that trim is sometimes something like
+    \xs -> intersectNameSet (mkNameSet bound_names) xs
+and we don't want to retain the list bound_names. This showed up in
+trac ticket #1136.
+-}
+
 ---------------------
 depAnalBinds :: Bag (LHsBind Name, [Name], Uses)
             -> ([(RecFlag, LHsBinds Name)], DefUses)