Fix #11814 by throwing more stuff into InScopeSets
authorRichard Eisenberg <eir@cis.upenn.edu>
Wed, 6 Apr 2016 13:24:34 +0000 (15:24 +0200)
committerRichard Eisenberg <eir@cis.upenn.edu>
Tue, 12 Apr 2016 12:14:18 +0000 (08:14 -0400)
compiler/stranal/WwLib.hs
compiler/types/Type.hs

index 7c85036..4ec36ba 100644 (file)
@@ -22,6 +22,7 @@ import MkCore           ( mkRuntimeErrorApp, aBSENT_ERROR_ID, mkCoreUbxTup )
 import MkId             ( voidArgId, voidPrimId )
 import TysPrim          ( voidPrimTy )
 import TysWiredIn       ( tupleDataCon )
+import VarEnv           ( mkInScopeSet )
 import Type
 import Coercion
 import FamInstEnv
@@ -127,7 +128,9 @@ mkWwBodies :: DynFlags
 --                        E
 
 mkWwBodies dflags fam_envs fun_ty demands res_info
-  = do  { (wrap_args, wrap_fn_args, work_fn_args, res_ty) <- mkWWargs emptyTCvSubst fun_ty demands
+  = do  { let empty_subst = mkEmptyTCvSubst (mkInScopeSet (tyCoVarsOfType fun_ty))
+
+        ; (wrap_args, wrap_fn_args, work_fn_args, res_ty) <- mkWWargs empty_subst fun_ty demands
         ; (useful1, work_args, wrap_fn_str, work_fn_str) <- mkWWstr dflags fam_envs wrap_args
 
         -- Do CPR w/w.  See Note [Always do CPR w/w]
index c5561a3..8901968 100644 (file)
@@ -1084,9 +1084,9 @@ mkCastTy ty co | isReflexiveCo co = ty
 
 mkCastTy (CastTy ty co1) co2 = mkCastTy ty (co1 `mkTransCo` co2)
 -- See Note [Weird typing rule for ForAllTy]
-mkCastTy (ForAllTy (Named tv vis) inner_ty) co
+mkCastTy outer_ty@(ForAllTy (Named tv vis) inner_ty) co
   = -- have to make sure that pushing the co in doesn't capture the bound var
-    let fvs = tyCoVarsOfCo co
+    let fvs = tyCoVarsOfCo co `unionVarSet` tyCoVarsOfType outer_ty
         empty_subst = mkEmptyTCvSubst (mkInScopeSet fvs)
         (subst, tv') = substTyVarBndr empty_subst tv
     in