<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman",serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p.Code, li.Code, div.Code
        {mso-style-name:Code;
        margin-top:0cm;
        margin-right:0cm;
        margin-bottom:0cm;
        margin-left:36.0pt;
        margin-bottom:.0001pt;
        font-size:9.0pt;
        font-family:"Courier New";}
p.msonormal0, li.msonormal0, div.msonormal0
        {mso-style-name:msonormal;
        mso-margin-top-alt:auto;
        margin-right:0cm;
        mso-margin-bottom-alt:auto;
        margin-left:0cm;
        font-size:12.0pt;
        font-family:"Times New Roman",serif;}
span.EmailStyle19
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:windowtext;
        font-weight:normal;
        font-style:normal;
        text-decoration:none none;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;
        mso-fareast-language:EN-US;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-GB" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal"><span style="font-family:"Calibri",sans-serif;mso-fareast-language:EN-US">I think it’s probably the desugarer, and the plugin can’t do anything before desugaring!<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Calibri",sans-serif;mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Calibri",sans-serif;mso-fareast-language:EN-US">By all means open a ticket.  I can advise if anyone wants to take it up.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Calibri",sans-serif;mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Calibri",sans-serif;mso-fareast-language:EN-US">Simon<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Calibri",sans-serif;mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<div style="border:none;border-left:solid blue 1.5pt;padding:0cm 0cm 0cm 4.0pt">
<div>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0cm 0cm 0cm">
<p class="MsoNormal"><b><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif">From:</span></b><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif"> Levent Erkok [mailto:erkokl@gmail.com]
<br>
<b>Sent:</b> 08 December 2015 03:32<br>
<b>To:</b> Simon Peyton Jones <simonpj@microsoft.com><br>
<b>Cc:</b> Eric Seidel <eric@seidel.io>; omeragacan@gmail.com; ezyang@mit.edu; ghc-devs@haskell.org<br>
<b>Subject:</b> Re: Plugins: Accessing unexported bindings<o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal">Thanks for the explanation, Simon. I think Eric is spot on. Looking at some of the "ghc -v3" output, it appears GHC always runs the following passes before any plugins are run:<o:p></o:p></p>
<div>
<p class="MsoNormal"> <o:p></o:p></p>
</div>
<div>
<div>
<p class="MsoNormal">   *** Simplify:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">   *** CorePrep:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">   *** ByteCodeGen:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">   *** Desugar:<o:p></o:p></p>
</div>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Just judging by the name, it could either be the first "Simplify" or the "Desugar" that gets rid of the dead-code at this point, I'm not sure which.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">It would help if this stage didn't remove dead-bindings. If doing so automatically is not the best option, requiring a user given pragma like 'KeepAlive' wouldn't be too onerous either.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">-Levent.<o:p></o:p></p>
</div>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal">On Mon, Dec 7, 2015 at 8:22 AM, Simon Peyton Jones <<a href="mailto:simonpj@microsoft.com" target="_blank">simonpj@microsoft.com</a>> wrote:<o:p></o:p></p>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0cm 0cm 0cm 6.0pt;margin-left:4.8pt;margin-right:0cm">
<p class="MsoNormal">It would not be hard to stop the desugarer dropping dead bindings, if that was helpful.<br>
<br>
S<br>
<br>
|  -----Original Message-----<br>
|  From: Eric Seidel [mailto:<a href="mailto:eric@seidel.io">eric@seidel.io</a>]<br>
|  Sent: 07 December 2015 15:44<br>
|  To: Simon Peyton Jones <<a href="mailto:simonpj@microsoft.com">simonpj@microsoft.com</a>><o:p></o:p></p>
<div>
<div>
<p class="MsoNormal">|  Cc: Levent Erkok <<a href="mailto:erkokl@gmail.com">erkokl@gmail.com</a>>;
<a href="mailto:omeragacan@gmail.com">omeragacan@gmail.com</a>;<br>
|  <a href="mailto:ezyang@mit.edu">ezyang@mit.edu</a>; <a href="mailto:ghc-devs@haskell.org">
ghc-devs@haskell.org</a><br>
|  Subject: Re: Plugins: Accessing unexported bindings<br>
|<br>
|  The problem, as I recall, is that GHC does an initial bit of dead-code<br>
|  elimination in the desugarer, before the plugins have a chance to run.<br>
|  (I believe this is part of simpleOptPgm, but may be mistaken)<br>
|<br>
|  I'm not sure why this is done in the desugarer, it seems to be out of<br>
|  place there.<br>
|<br>
|  On Mon, Dec 7, 2015, at 05:14, Simon Peyton Jones wrote:<br>
|  > Plugins get to edit the entire core-to-core pipeline!  There is no<br>
|  magic.<br>
|  >  At least I don’t think so<br>
|  ><br>
|  > <a href="file:///Z:/tmp/users_guide/compiler-plugins.html">file:///Z:/tmp/users_guide/compiler-plugins.html</a><br>
|  ><br>
|  > S<br>
|  ><br>
|  > From: Levent Erkok [mailto:<a href="mailto:erkokl@gmail.com">erkokl@gmail.com</a>]<br>
|  > Sent: 07 December 2015 13:11<br>
|  > To: Simon Peyton Jones <<a href="mailto:simonpj@microsoft.com">simonpj@microsoft.com</a>><br>
|  > Cc: Eric Seidel <<a href="mailto:eric@seidel.io">eric@seidel.io</a>>; <a href="mailto:omeragacan@gmail.com">
omeragacan@gmail.com</a>;<br>
|  > <a href="mailto:ezyang@mit.edu">ezyang@mit.edu</a>; <a href="mailto:ghc-devs@haskell.org">
ghc-devs@haskell.org</a><br>
|  > Subject: Re: Plugins: Accessing unexported bindings<br>
|  ><br>
|  > That's a good point; keeping all annotated bindings alive seems to<br>
|  be<br>
|  > an overkill..<br>
|  ><br>
|  > Regarding implementing "pass at the start." I'm not sure if plugin<br>
|  > authors have any freedom as to decide when their plugin actually<br>
|  runs.<br>
|  > It seems GHC magically determines the order and runs them. Can you<br>
|  > point me to some code/docs that tells me how to go "first" in that<br>
|  > sense? (Or at least before the pass that drops dead code.)<br>
|  ><br>
|  > On Dec 7, 2015, at 4:45 AM, Simon Peyton Jones<br>
|  > <<a href="mailto:simonpj@microsoft.com">simonpj@microsoft.com</a><mailto:<a href="mailto:simonpj@microsoft.com">simonpj@microsoft.com</a>>> wrote:<br>
|  > Indeed. How about this: if there's an ANN on a binder (any ANN),<br>
|  then<br>
|  > GHC should keep it alive.<br>
|  ><br>
|  > Really?  It might be something like “don’t give warnings for this<br>
|  > binding” or “don’t inline me” or something.   To say *any*<br>
|  annotation<br>
|  > seems a bit brutal doesn’t it?    Mind you I don’t have a better<br>
|  idea.<br>
|  ><br>
|  > One thought: your plugin could add a pass right at the start, which<br>
|  > marks everything you want as keep-alive.<br>
|  ><br>
|  > S<br>
|  ><br>
|  > From: Levent Erkok [mailto:<a href="mailto:erkokl@gmail.com">erkokl@gmail.com</a>]<br>
|  > Sent: 07 December 2015 12:42<br>
|  > To: Simon Peyton Jones<br>
|  > <<a href="mailto:simonpj@microsoft.com">simonpj@microsoft.com</a><mailto:<a href="mailto:simonpj@microsoft.com">simonpj@microsoft.com</a>>><br>
|  > Cc: Eric Seidel <<a href="mailto:eric@seidel.io">eric@seidel.io</a><mailto:<a href="mailto:eric@seidel.io">eric@seidel.io</a>>>;<br>
|  > <a href="mailto:omeragacan@gmail.com">omeragacan@gmail.com</a><mailto:<a href="mailto:omeragacan@gmail.com">omeragacan@gmail.com</a>>;<br>
|  > <a href="mailto:ezyang@mit.edu">ezyang@mit.edu</a><mailto:<a href="mailto:ezyang@mit.edu">ezyang@mit.edu</a>>;<br>
|  > <a href="mailto:ghc-devs@haskell.org">ghc-devs@haskell.org</a><mailto:<a href="mailto:ghc-devs@haskell.org">ghc-devs@haskell.org</a>><br>
|  > Subject: Re: Plugins: Accessing unexported bindings<br>
|  ><br>
|  > Indeed. How about this: if there's an ANN on a binder (any ANN),<br>
|  then<br>
|  > GHC should keep it alive.<br>
|  ><br>
|  > Is that something one of the core-developers can implement? Happy to<br>
|  > open a ticket if that helps.<br>
|  ><br>
|  > On Dec 7, 2015, at 4:14 AM, Simon Peyton Jones<br>
|  > <<a href="mailto:simonpj@microsoft.com">simonpj@microsoft.com</a><mailto:<a href="mailto:simonpj@microsoft.com">simonpj@microsoft.com</a>>> wrote:<br>
|  > If it's "dead" in this sense, it's already removed from ModGuts, no?<br>
|  ><br>
|  > Yes, if it’s dead it’s gone.   That’s not too surprising, is it?<br>
|  ><br>
|  > So you need a way to keep it alive. Maybe we need a pragma for that.<br>
|  Or<br>
|  > how would you like to signal it in the source code?<br>
|  ><br>
|  > Simon<br>
|  ><br>
|  > From: Levent Erkok [mailto:<a href="mailto:erkokl@gmail.com">erkokl@gmail.com</a>]<br>
|  > Sent: 07 December 2015 12:05<br>
|  > To: Simon Peyton Jones<br>
|  > <<a href="mailto:simonpj@microsoft.com">simonpj@microsoft.com</a><mailto:<a href="mailto:simonpj@microsoft.com">simonpj@microsoft.com</a>>><br>
|  > Cc: Eric Seidel <<a href="mailto:eric@seidel.io">eric@seidel.io</a><mailto:<a href="mailto:eric@seidel.io">eric@seidel.io</a>>>;<br>
|  > <a href="mailto:omeragacan@gmail.com">omeragacan@gmail.com</a><mailto:<a href="mailto:omeragacan@gmail.com">omeragacan@gmail.com</a>>;<br>
|  > <a href="mailto:ezyang@mit.edu">ezyang@mit.edu</a><mailto:<a href="mailto:ezyang@mit.edu">ezyang@mit.edu</a>>;<br>
|  > <a href="mailto:ghc-devs@haskell.org">ghc-devs@haskell.org</a><mailto:<a href="mailto:ghc-devs@haskell.org">ghc-devs@haskell.org</a>><br>
|  > Subject: Re: Plugins: Accessing unexported bindings<br>
|  ><br>
|  > Thanks Simon.. But I remain utterly confused. As a "plugin" author,<br>
|  > how do I get my hands on the Id associated with a top-level binder?<br>
|  If<br>
|  > it's "dead" in this sense, it's already removed from ModGuts, no?<br>
|  ><br>
|  > That is, by the time GHC runs my plugin, the Id has already<br>
|  > disappeared for me to mark it "Local Exported." Is that not correct?<br>
|  ><br>
|  > On Dec 7, 2015, at 2:28 AM, Simon Peyton Jones<br>
|  > <<a href="mailto:simonpj@microsoft.com">simonpj@microsoft.com</a><mailto:<a href="mailto:simonpj@microsoft.com">simonpj@microsoft.com</a>>> wrote:<br>
|  > In the mean time, I'm still looking for a solution that doesn't<br>
|  > involve exporting such identifiers from modules. As Eric pointed<br>
|  out,<br>
|  > that seems to be the only current work-around for the time being.<br>
|  ><br>
|  > “Exported” in this context only means “keep alive”. It does not mean<br>
|  > exported in the Haskell source code sense. I’ve just added this<br>
|  > comment to Var.hs.<br>
|  ><br>
|  > So I think it does just what you want.<br>
|  ><br>
|  > Simon<br>
|  ><br>
|  > data ExportFlag   -- See Note [ExportFlag on binders]<br>
|  >   = NotExported   -- ^ Not exported: may be discarded as dead code.<br>
|  >   | Exported      -- ^ Exported: kept alive<br>
|  ><br>
|  > {- Note [ExportFlag on binders]<br>
|  > ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br>
|  > An ExportFlag of "Exported" on a top-level binder says "keep this<br>
|  > binding alive; do not drop it as dead code".  This transititively<br>
|  > keeps alive all the other top-level bindings that this binding<br>
|  refers<br>
|  > to.  This property is persisted all the way down the pipeline, so<br>
|  that<br>
|  > the binding will be compiled all the way to object code, and its<br>
|  > symbols will appear in the linker symbol table.<br>
|  ><br>
|  > However, note that this use of "exported" is quite different to the<br>
|  > export list on a Haskell module.  Setting the ExportFlag on an Id<br>
|  does<br>
|  > /not/ mean that if you import the module (in Haskell source code you<br>
|  > will see this Id.  Of course, things that appear in the export list<br>
|  of<br>
|  > the source Haskell module do indeed have their ExportFlag set.<br>
|  > But many other things, such as dictionary functions, are kept alive<br>
|  by<br>
|  > having their ExportFlag set, even though they are not exported in<br>
|  the<br>
|  > source-code sense.<br>
|  ><br>
|  > We should probably use a different term for ExportFlag, like<br>
|  > KeepAlive.<br>
|  ><br>
|  > From: ghc-devs [mailto:<a href="mailto:ghc-devs-bounces@haskell.org">ghc-devs-bounces@haskell.org</a>] On Behalf Of<br>
|  > Levent Erkok<br>
|  > Sent: 06 December 2015 20:32<br>
|  > To: Eric Seidel <<a href="mailto:eric@seidel.io">eric@seidel.io</a><mailto:<a href="mailto:eric@seidel.io">eric@seidel.io</a>>>;<br>
|  > <a href="mailto:omeragacan@gmail.com">omeragacan@gmail.com</a><mailto:<a href="mailto:omeragacan@gmail.com">omeragacan@gmail.com</a>>;<br>
|  > <a href="mailto:ezyang@mit.edu">ezyang@mit.edu</a><mailto:<a href="mailto:ezyang@mit.edu">ezyang@mit.edu</a>><br>
|  > Cc: <a href="mailto:ghc-devs@haskell.org">ghc-devs@haskell.org</a><mailto:<a href="mailto:ghc-devs@haskell.org">ghc-devs@haskell.org</a>><br>
|  > Subject: Re: Plugins: Accessing unexported bindings<br>
|  ><br>
|  > Omer, Eric, Ed: Thanks for the comments.<br>
|  ><br>
|  > Omer: I think Eric's observation is at play here. We're talking<br>
|  about<br>
|  > "dead-code," i.e., a binding that is neither exported, nor used by<br>
|  any<br>
|  > binding inside the module. Those seem to be getting dropped by the<br>
|  > time user-plugins are run. Unfortunately, this is precisely what one<br>
|  > would do with "properties" embedded in code. They serve as<br>
|  > documentation perhaps, but are otherwise not needed by any other<br>
|  > binding nor it makes sense to export them.<br>
|  ><br>
|  > Edward: Can you provide some more info into your solution? Sounds<br>
|  like<br>
|  > a chicken-egg issue to me: As a plugin author, I need the bindings<br>
|  to<br>
|  > access the Ids, and looks like I need the Ids to access the binders?<br>
|  ><br>
|  > A simple solution would be to simply keep all top-level bindings<br>
|  > around while the plugin are running, but that obviously can lead to<br>
|  > unnecessary work if the code is truly dead. A compromise could be<br>
|  that<br>
|  > the annotations can serve as entry points as well: I.e., if there's<br>
|  an<br>
|  > annotation on a top-level binder, then it should *not* be considered<br>
|  > dead-code at least until after all the plugins are run. That would<br>
|  > definitely simplify life. Would that be an acceptable alternative?<br>
|  ><br>
|  > In the mean time, I'm still looking for a solution that doesn't<br>
|  > involve exporting such identifiers from modules. As Eric pointed<br>
|  out,<br>
|  > that seems to be the only current work-around for the time being.<br>
|  ><br>
|  > Thanks,<br>
|  ><br>
|  > -Levent.<br>
|  ><br>
|  > On Sun, Dec 6, 2015 at 11:08 AM, Eric Seidel<br>
|  > <<a href="mailto:eric@seidel.io">eric@seidel.io</a><mailto:<a href="mailto:eric@seidel.io">eric@seidel.io</a>>> wrote:<br>
|  > GHC should only drop un-exported bindings from the ModGuts if<br>
|  they're<br>
|  > also unused, ie *dead code*.<br>
|  ><br>
|  > The only way I know to get around this is to use the bindings<br>
|  > somewhere, or just export them.<br>
|  ><br>
|  > On Sat, Dec 5, 2015, at 23:01, Levent Erkok wrote:<br>
|  > > Hello,<br>
|  > ><br>
|  > > The mg_binds field of the ModGuts seem to only contain the<br>
|  bindings<br>
|  > > that are exported from the module being compiled.<br>
|  > ><br>
|  > > I guess GHC must be running user-plugins after it drops the<br>
|  bindings<br>
|  > > that are not exported, which makes perfect sense for most use<br>
|  cases.<br>
|  > > However, I'm working on a plugin where the end-programmer embeds<br>
|  > > "properties" in the form of functions inside his/her code, which<br>
|  are<br>
|  > > not necessarily exported from the module under consideration.<br>
|  > ><br>
|  > > Is there a way to access all top-level bindings in a module from a<br>
|  > > plugin, even if those bindings are not exported?<br>
|  > ><br>
|  > > Thanks,<br>
|  > ><br>
|  > > -Levent.<br>
|  > > _______________________________________________<br>
|  > > ghc-devs mailing list<br>
|  > > <a href="mailto:ghc-devs@haskell.org">ghc-devs@haskell.org</a><mailto:<a href="mailto:ghc-devs@haskell.org">ghc-devs@haskell.org</a>><br>
|  > ><o:p></o:p></p>
</div>
</div>
<p class="MsoNormal">|  <a href="https://na01.safelinks.protection.outlook.com/?url=http%3a%2f%2fmail" target="_blank">
https://na01.safelinks.protection.outlook.com/?url=http%3a%2f%2fmail</a><br>
|  > > .<a href="https://na01.safelinks.protection.outlook.com/?url=http%3a%2f%2fhaskell.org&data=01%7c01%7csimonpj%40064d.mgd.microsoft.com%7ce3d9fc32f78e4a42bc8108d2ff80251a%7c72f988bf86f141af91ab2d7cd011db47%7c1&sdata=qk2h3pMEX2WFCux6QLm4rXk%2faqydq4W13J5U%2bOPZKWo%3d" target="_blank">haskell.org</a>%2fcgi-bin%2fmailman%2flistinfo%2fghc-<br>
|  devs&data=01%7c01%<br>
|  > ><br>
|  7csimonpj%<a href="https://na01.safelinks.protection.outlook.com/?url=http%3a%2f%2f40064d.mgd.microsoft.com&data=01%7c01%7csimonpj%40064d.mgd.microsoft.com%7ce3d9fc32f78e4a42bc8108d2ff80251a%7c72f988bf86f141af91ab2d7cd011db47%7c1&sdata=9om7aGmNLkTw%2bvUYADKPk7040LjeLAwT2DQz511Wi5M%3d" target="_blank">40064d.mgd.microsoft.com</a>%7cf6e3a9d4ad9f4e53a3ab08d2ff1d493<br>
|  > ><br>
|  4%7c72f988bf86f141af91ab2d7cd011db47%7c1&sdata=Bv7lpsB%2fD88nSMuB7NY<br>
|  > ><br>
|  fBqR90%2bBq%2fwpJJ0JU9%2b6E4RI%3d<<a href="https://na01.safelinks.protection" target="_blank">https://na01.safelinks.protection</a>.<br>
|  > > <a href="https://na01.safelinks.protection.outlook.com/?url=http%3a%2f%2foutlook.com%2f%3furl%3dhttp%253a%252f%252fmail.haskell.org%252fcgi-&data=01%7c01%7csimonpj%40064d.mgd.microsoft.com%7ce3d9fc32f78e4a42bc8108d2ff80251a%7c72f988bf86f141af91ab2d7cd011db47%7c1&sdata=VxOGYDnOtuRJ0X%2fgNtZoxIA5lzCe9vIGSZNbq2Nj0Tc%3d" target="_blank">
outlook.com/?url=http%3a%2f%2fmail.haskell.org%2fcgi-</a><br>
|  bin%2fmailman%2<br>
|  > > flistinfo%2fghc-<br>
|  devs&data=01%7c01%7csimonpj%<a href="https://na01.safelinks.protection.outlook.com/?url=http%3a%2f%2f40064d.mgd.microsoft.com&data=01%7c01%7csimonpj%40064d.mgd.microsoft.com%7ce3d9fc32f78e4a42bc8108d2ff80251a%7c72f988bf86f141af91ab2d7cd011db47%7c1&sdata=9om7aGmNLkTw%2bvUYADKPk7040LjeLAwT2DQz511Wi5M%3d" target="_blank">40064d.mgd.microsoft.com</a><br>
|  > ><br>
|  %7cac4cbfe22e314080909908d2fe7c4ed8%7c72f988bf86f141af91ab2d7cd011db<br>
|  > > 47%7c1&sdata=1z6DcZxjIAKj0PcsLeALphRLWJ3i%2fxvyaPtq0qo6elY%3d><br>
|  > _______________________________________________<br>
|  > ghc-devs mailing list<br>
|  > <a href="mailto:ghc-devs@haskell.org">ghc-devs@haskell.org</a><mailto:<a href="mailto:ghc-devs@haskell.org">ghc-devs@haskell.org</a>><br>
|  ><br>
|  <a href="https://na01.safelinks.protection.outlook.com/?url=http%3a%2f%2fmail.h" target="_blank">
https://na01.safelinks.protection.outlook.com/?url=http%3a%2f%2fmail.h</a><br>
|  > <a href="https://na01.safelinks.protection.outlook.com/?url=http%3a%2f%2faskell.org&data=01%7c01%7csimonpj%40064d.mgd.microsoft.com%7ce3d9fc32f78e4a42bc8108d2ff80251a%7c72f988bf86f141af91ab2d7cd011db47%7c1&sdata=GX53BhjqknGuX4oZVWqLVbz%2b7Up6NY9YLKjWTkwoeck%3d" target="_blank">
askell.org</a>%2fcgi-bin%2fmailman%2flistinfo%2fghc-<br>
|  devs&data=01%7c01%7csi<br>
|  ><br>
|  monpj%<a href="https://na01.safelinks.protection.outlook.com/?url=http%3a%2f%2f40064d.mgd.microsoft.com&data=01%7c01%7csimonpj%40064d.mgd.microsoft.com%7ce3d9fc32f78e4a42bc8108d2ff80251a%7c72f988bf86f141af91ab2d7cd011db47%7c1&sdata=9om7aGmNLkTw%2bvUYADKPk7040LjeLAwT2DQz511Wi5M%3d" target="_blank">40064d.mgd.microsoft.com</a>%7cf6e3a9d4ad9f4e53a3ab08d2ff1d4934%7c72<br>
|  ><br>
|  f988bf86f141af91ab2d7cd011db47%7c1&sdata=Bv7lpsB%2fD88nSMuB7NYfBqR90%2<br>
|  ><br>
|  bBq%2fwpJJ0JU9%2b6E4RI%3d<<a href="https://na01.safelinks.protection.outlook.co" target="_blank">https://na01.safelinks.protection.outlook.co</a><br>
|  > m/?url=http%3a%2f%<a href="https://na01.safelinks.protection.outlook.com/?url=http%3a%2f%2f2fmail.haskell.org&data=01%7c01%7csimonpj%40064d.mgd.microsoft.com%7ce3d9fc32f78e4a42bc8108d2ff80251a%7c72f988bf86f141af91ab2d7cd011db47%7c1&sdata=BiZsEZyyTCvpit0cBcPceGv2E6hQ172kSrf6kcDp0so%3d" target="_blank">2fmail.haskell.org</a>%2fcgi-<br>
|  bin%2fmailman%2flistinfo%2f<br>
|  > ghc-<br>
|  devs&data=01%7c01%7csimonpj%<a href="https://na01.safelinks.protection.outlook.com/?url=http%3a%2f%2f40064d.mgd.microsoft.com&data=01%7c01%7csimonpj%40064d.mgd.microsoft.com%7ce3d9fc32f78e4a42bc8108d2ff80251a%7c72f988bf86f141af91ab2d7cd011db47%7c1&sdata=9om7aGmNLkTw%2bvUYADKPk7040LjeLAwT2DQz511Wi5M%3d" target="_blank">40064d.mgd.microsoft.com</a>%7cac4cbfe22e3<br>
|  ><br>
|  14080909908d2fe7c4ed8%7c72f988bf86f141af91ab2d7cd011db47%7c1&sdata=1z6<br>
|  > DcZxjIAKj0PcsLeALphRLWJ3i%2fxvyaPtq0qo6elY%3d><br>
|  ><o:p></o:p></p>
</blockquote>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</div>
</div>
</body>
</html>