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

Fix inlining for default methods

This was discombobulated by a patch a week ago;
now fixed, quite straightforwardly.  See
Note [Default methods and instances]
parent 0237ed67
...@@ -531,13 +531,17 @@ tcInstDecls2 tycl_decls inst_decls ...@@ -531,13 +531,17 @@ tcInstDecls2 tycl_decls inst_decls
= do { -- (a) Default methods from class decls = do { -- (a) Default methods from class decls
let class_decls = filter (isClassDecl . unLoc) tycl_decls let class_decls = filter (isClassDecl . unLoc) tycl_decls
; dm_binds_s <- mapM tcClassDecl2 class_decls ; dm_binds_s <- mapM tcClassDecl2 class_decls
; let dm_binds = unionManyBags dm_binds_s
-- (b) instance declarations -- (b) instance declarations
; inst_binds_s <- mapM tcInstDecl2 inst_decls ; let dm_ids = collectHsBindsBinders dm_binds
-- Add the default method Ids (again)
-- See Note [Default methods and instances]
; inst_binds_s <- tcExtendIdEnv dm_ids $
mapM tcInstDecl2 inst_decls
-- Done -- Done
; return (unionManyBags dm_binds_s `unionBags` ; return (dm_binds `unionBags` unionManyBags inst_binds_s) }
unionManyBags inst_binds_s) }
tcInstDecl2 :: InstInfo Name -> TcM (LHsBinds Id) tcInstDecl2 :: InstInfo Name -> TcM (LHsBinds Id)
tcInstDecl2 (InstInfo { iSpec = ispec, iBinds = ibinds }) tcInstDecl2 (InstInfo { iSpec = ispec, iBinds = ibinds })
...@@ -550,6 +554,18 @@ tcInstDecl2 (InstInfo { iSpec = ispec, iBinds = ibinds }) ...@@ -550,6 +554,18 @@ tcInstDecl2 (InstInfo { iSpec = ispec, iBinds = ibinds })
loc = getSrcSpan dfun_id loc = getSrcSpan dfun_id
\end{code} \end{code}
See Note [Default methods and instances]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The default method Ids are already in the type environment (see Note
[Default method Ids and Template Haskell] in TcTyClsDcls), BUT they
don't have their InlinePragmas yet. Usually that would not matter,
because the simplifier propagates information from binding site to
use. But, unusually, when compiling instance decls we *copy* the
INLINE pragma from the default method to the method for that
particular operation (see Note [INLINE and default methods] below).
So right here in tcInstDecl2 we must re-extend the type envt with
the default method Ids replete with their INLINE pragmas. Urk.
\begin{code} \begin{code}
tc_inst_decl2 :: Id -> InstBindings Name -> TcM (LHsBinds Id) tc_inst_decl2 :: Id -> InstBindings Name -> TcM (LHsBinds Id)
......
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