Right; I've committed this change. SImon
| -----Original Message----- | From: Tobias Gedell [mailto:[EMAIL PROTECTED]] | Sent: 29 January 2003 18:08 | To: glasgow-haskell-bugs | Subject: Core, shadowing type variable names, possible fix | | I have found what causes the bug and implemented a possibly fix for it. | The problem has to do with source types that aren't expanded before | tidying them. | | Here is a small example where the error occurs: | | ----- | module Test where | | newtype A a = A (forall b. b -> a) | | test :: forall q b. q -> A b | test _ = undefined | ----- | | | When generating Core for this program we get: | | ----- | %module Test | %newtype Test.A a = %forall b . b -> a; | Test.A :: %forall a . (%forall b . b -> a) -> %forall b . b -> a = | %note "InlineMe" | \ @ a (tpl::%forall b . b -> a) -> tpl; | Test.zdgfromA :: %forall a . (%forall b . b -> a) -> | %forall b . b -> a = | \ @ a (g::%forall b . b -> a) -> g; | Test.zdgtoA :: %forall a . (%forall b . b -> a) -> | %forall b . b -> a = | Test.A; | Test.test :: %forall q b . q -> %forall b . b -> b = | \ @ q @ b (ds::q) -> GHCziErr.undefined @ (%forall b . b -> b); | ----- | | Here the type for Test.test is wrong since the second binding of b | shadows the first binding of b. We do also pass the wrong type to | GHCziErr.undefined. | | The tidyXXX functions should take care of this and rename the second b | to b1. After diving into GHC I found that the problem is that the types | and expressions are tidied before the source types are expanded. When | generating external core the source types are expanded first in make_ty | in MkExternalCore.lhs. | | | I believe that there are three possible fixes: | | 1. Make sure that all type variables that are bound in non recursive | newtypes are made unique | 2. Expand all non recursive newtypes before using tidyXXX | 3. Not expand the non recursive newtypes when generating external core | | | I have implemented the third alternative. I changed the function make_ty | in MkExternalCore.lhs to: | | ----- | make_ty :: Type -> C.Ty | make_ty (TyVarTy tv) = C.Tvar (make_var_id (tyVarName tv)) | make_ty (AppTy t1 t2) = C.Tapp (make_ty t1) (make_ty t2) | make_ty (TyConApp tc ts) = foldl C.Tapp (C.Tcon (make_con_qid (tyConName | tc))) (map make_ty ts) | make_ty (FunTy t1 t2) = make_ty (TyConApp funTyCon [t1,t2]) | make_ty (ForAllTy tv t) = C.Tforall (make_tbind tv) (make_ty t) | make_ty (SourceTy (NType tc ts)) = foldl C.Tapp (C.Tcon (make_con_qid | (tyConName tc))) (map make_ty ts) | make_ty (SourceTy p) = make_ty (sourceTypeRep p) | make_ty (NoteTy _ t) = make_ty t | ----- | | | Now the generated Core for the program listed above becomes: | | ----- | %module Test | %newtype Test.A a = %forall b . b -> a; | Test.A :: %forall a . (%forall b . b -> a) -> Test.A a = | %note "InlineMe" | \ @ a (tpl::%forall b . b -> a) -> tpl; | Test.zdgfromA :: %forall a . Test.A a -> %forall b . b -> a = | \ @ a (g::Test.A a) -> g; | Test.zdgtoA :: %forall a . (%forall b . b -> a) -> Test.A a = | Test.A; | Test.test :: %forall q b . q -> Test.A b = | \ @ q @ b (ds::q) -> GHCziErr.undefined @ (Test.A b); | ----- | | | | | Sincerely, | Tobias | | _______________________________________________ | Glasgow-haskell-bugs mailing list | [EMAIL PROTECTED] | http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs _______________________________________________ Glasgow-haskell-bugs mailing list [EMAIL PROTECTED] http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs