RE: Core, shadowing type variable names, possible fix
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
RE: 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. Quite right. Well found. | 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. Yes, that looks fine. I think we'd better update the External Core documentation about newtypes too (in ghc/docs/ext-core/core.tex). If you felt like adding anything to it, go ahead; or else I will sometime. Simon ___ Glasgow-haskell-bugs mailing list [EMAIL PROTECTED] http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs
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