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

Reply via email to