I've made this fix in the HEAD, thank you.

Simon

| -----Original Message-----
| From: Tobias Gedell [mailto:[EMAIL PROTECTED]]
| Sent: 25 January 2003 11:54
| To: glasgow-haskell-bugs
| Subject: Core, implicit bindings are emitted in the wrong order
| 
| The implicit bindings are emitted in the wrong order when generating
Core.
| 
| It seems like the problem occurs since the implicit bindings does not
| only consist of wrappers and class functions but also conversion
| functions. These conversion functions sometimes use wrappers that have
| not yet been defined.
| 
| An example of this is found at line 240 in Base.hcr (generated with
the
| -O0 flag):
| 
| -------------
| GHCziBase.zdgfromBool ::
|       GHCziBase.Bool ->
|       GHCziBase.ZCzpZC GHCziBase.Unit GHCziBase.Unit =
|   \ (g::GHCziBase.Bool) ->
|    %case g %of (g1::GHCziBase.Bool)
|    {
|     GHCziBase.False ->
|      GHCziBase.Inl @ GHCziBase.Unit @ GHCziBase.Unit GHCziBase.Unit;
|     GHCziBase.True ->
|      GHCziBase.Inr @ GHCziBase.Unit @ GHCziBase.Unit GHCziBase.Unit
|    };
| --------------
| 
| Here we try to use the wrappers GHCziBase.Inl and GHCziBase.Inr but
they
| are defined first at line 346.
| 
| 
| Maybe these conversion functions only use GHCziBase.ZCzpZC and then a
| possible fix would be to make sure that GHCziBase.Inl and
GHCziBase.Inr
| are defined before all other implicit bindings.
| 
| Another possible fix that I have implemented is to make sure that all
| wrappers are defined before all other implicit bindings.
| 
| 
| I have replaced line 53-70 in ghc/compiler/coreSyn/MkExternalCore.lhs
with:
| 
| ----------
| mkExternalCore :: ModGuts -> C.Module
| mkExternalCore (ModGuts {mg_module=this_mod, mg_types = type_env,
| mg_binds = binds})
|    = C.Module mname tdefs vdefs
|    where
|      mname  = make_mid this_mod
|      tdefs  = foldr collect_tdefs [] tycons
|       -- Don't forget to include the implicit bindings!
|      vdefs  = map make_vdef (implicit_wbinds ++ implicit_binds ++
binds)
|      tycons = map classTyCon (typeEnvClasses type_env) ++
typeEnvTyCons
| type_env
| 
|      tything = typeEnvElts type_env
|      implicit_wbinds = map get_defn $ concatMap implicit_wids tything
|      implicit_binds = map get_defn $ concatMap implicit_ids tything
| 
| -- Get only the wrappers
| implicit_wids :: TyThing -> [Id]
| -- C.f. HscTypes.mkImplicitBinds, but we do not include constructor
workers
| implicit_wids (ATyCon tc) = map dataConWrapId (tyConDataCons_maybe tc
| `orElse` [])
| implicit_wids other       = []
| 
| -- Get all other bindings
| implicit_ids :: TyThing -> [Id]
| implicit_ids (ATyCon tc) = tyConSelIds tc ++ tyConGenIds tc
| implicit_ids (AClass cl) = classSelIds cl
| implicit_ids other       = []
| ----------
| 
| 
| 
| 
| 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

Reply via email to