RE: Core, shadowing type variable names, possible fix

2003-02-05 Thread Simon Peyton-Jones
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

2003-01-30 Thread Simon Peyton-Jones
| 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

2003-01-29 Thread Tobias Gedell
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