Commit ef61cbbc authored by simonpj@microsoft.com's avatar simonpj@microsoft.com
Browse files

Do not put wired-in things in interface files

There is no need for wired-in things to go into interface files; the compiler
knows about them anyway.  Worse, it turns ou that if they are in an interface
file, they may get read in with not-quite-right type info (e.g. GHC.Err.error),
and the not-quite-right thing gets into the type envt.  Than it gets used 
instead of the wired in thing.

Best all round never to put them into interface files.  This is the way
it used to be, but it looks as if it rotted away some time ago.

(I noticed this when fixing unsafePerformIO stuff, becuase 'lazy' was getting
an unfolding when it shouldn't.)
parent 302265d5
...@@ -279,8 +279,10 @@ mkIface hsc_env maybe_old_iface ...@@ -279,8 +279,10 @@ mkIface hsc_env maybe_old_iface
; decls = [ tyThingToIfaceDecl ext_nm_rhs thing ; decls = [ tyThingToIfaceDecl ext_nm_rhs thing
| thing <- typeEnvElts type_env, | thing <- typeEnvElts type_env,
not (isImplicitName (getName thing)) ] let name = getName thing,
not (isImplicitName name || isWiredInName name) ]
-- Don't put implicit Ids and class tycons in the interface file -- Don't put implicit Ids and class tycons in the interface file
-- Nor wired-in things; the compiler knows about them anyhow
; fixities = [(occ,fix) | FixItem occ fix _ <- nameEnvElts fix_env] ; fixities = [(occ,fix) | FixItem occ fix _ <- nameEnvElts fix_env]
; deprecs = mkIfaceDeprec src_deprecs ; deprecs = mkIfaceDeprec src_deprecs
......
...@@ -48,8 +48,24 @@ import Array ( Array, array, (!) ) ...@@ -48,8 +48,24 @@ import Array ( Array, array, (!) )
%* * %* *
%************************************************************************ %************************************************************************
We have two ``builtin name funs,'' one to look up @TyCons@ and Notes about wired in things
@Classes@, the other to look up values. ~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Wired-in things are Ids/TyCons that are completely known to the compiler.
They are global values in GHC, (e.g. listTyCon :: TyCon).
* A wired in Name contains the thing itself inside the Name:
see Name.wiredInNameTyThing_maybe
(E.g. listTyConName contains listTyCon.
* The name cache is initialised with (the names of) all wired-in things
* The type checker sees if the Name is wired in before looking up
the name in the type environment. So the type envt itself contains
no wired in things.
* MkIface prunes out wired-in things before putting them in an interface file.
So interface files never contain wired-in things.
\begin{code} \begin{code}
wiredInThings :: [TyThing] wiredInThings :: [TyThing]
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment