X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;ds=sidebyside;f=ghc%2Fcompiler%2Ftypecheck%2FTcRules.lhs;h=0688922093d41c0fef6343265c8ba687ddf22604;hb=b2d205e39c0e2cdb054c53c6a3f14c9489f6b9b5;hp=6f9890bafa49a4c3e036e50e6bfcdacf4dcb7cee;hpb=deafae587c0ee3b0fc005e2f5e654649aa27596b;p=ghc-hetmet.git diff --git a/ghc/compiler/typecheck/TcRules.lhs b/ghc/compiler/typecheck/TcRules.lhs index 6f9890b..0688922 100644 --- a/ghc/compiler/typecheck/TcRules.lhs +++ b/ghc/compiler/typecheck/TcRules.lhs @@ -15,7 +15,7 @@ import TcHsSyn ( TypecheckedRuleDecl, TcExpr, mkHsLet ) import TcRnMonad import TcSimplify ( tcSimplifyToDicts, tcSimplifyInferCheck ) import TcMType ( newTyVarTy ) -import TcType ( TcTyVarSet, tyVarsOfTypes, openTypeKind ) +import TcType ( TcTyVarSet, tyVarsOfTypes, tyVarsOfType, openTypeKind ) import TcIfaceSig ( tcCoreExpr, tcCoreLamBndrs, tcVar ) import TcMonoType ( tcHsSigType, UserTypeCtxt(..), tcAddScopedTyVars ) import TcExpr ( tcMonoExpr ) @@ -87,12 +87,10 @@ tcRule (HsRule name act vars lhs rhs src_loc) -- RULE: forall v. fst (ss v) = fst v -- The type of the rhs of the rule is just a, but v::(a,(b,c)) -- - -- We also need to get the free tyvars of the LHS; see notes - -- below with ruleLhsTvs. + -- We also need to get the free tyvars of the LHS; but we do that + -- during zonking (see TcHsSyn.zonkRule) -- forall_tvs = tyVarsOfTypes (rule_ty : map idType tpl_ids) - `unionVarSet` - ruleLhsTvs lhs' in -- RHS can be a bit more lenient. In particular, -- we let constant dictionaries etc float outwards @@ -114,34 +112,6 @@ tcRule (HsRule name act vars lhs rhs src_loc) new_id (RuleBndrSig var rn_ty) = tcHsSigType (RuleSigCtxt var) rn_ty `thenM` \ ty -> returnM (mkLocalId var ty) -ruleLhsTvs :: TcExpr -> TcTyVarSet --- We need to gather the type variables mentioned on the LHS so we can --- quantify over them. Example: --- data T a = C --- --- foo :: T a -> Int --- foo C = 1 --- --- {-# RULES "myrule" foo C = 1 #-} --- --- After type checking the LHS becomes (foo a (C a)) --- and we do not want to zap the unbound tyvar 'a' to (), because --- that limits the applicability of the rule. Instead, we --- want to quantify over it! --- --- Fortunately the form of the LHS is pretty limited (see RnSource.validRuleLhs) --- so we don't need to deal with the whole of HsSyn. --- -ruleLhsTvs (OpApp e1 op _ e2) - = ruleLhsTvs e1 `unionVarSet` ruleLhsTvs op `unionVarSet` ruleLhsTvs e2 -ruleLhsTvs (HsApp e1 e2) - = ruleLhsTvs e1 `unionVarSet` ruleLhsTvs e2 -ruleLhsTvs (HsVar v) = emptyVarSet -- I don't think we need the tyvars of the Id -ruleLhsTvs (TyApp e1 tys) - = ruleLhsTvs e1 `unionVarSet` tyVarsOfTypes tys -ruleLhsTvs e = pprPanic "ruleLhsTvs" (ppr e) - - ruleCtxt name = ptext SLIT("When checking the transformation rule") <+> doubleQuotes (ftext name) \end{code}