<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;}
@font-face
        {font-family:"Book Antiqua";
        panose-1:2 4 6 2 5 3 5 3 3 4;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
@font-face
        {font-family:"Lucida Sans Unicode";
        panose-1:2 11 6 2 3 5 4 2 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
        {mso-style-priority:99;
        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;}
tt
        {mso-style-priority:99;
        font-family:"Courier New";}
span.EmailStyle19
        {mso-style-type:personal-reply;
        font-family:"Book Antiqua",serif;
        color:#943634;
        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;}
/* List Definitions */
@list l0
        {mso-list-id:1485078414;
        mso-list-template-ids:-1932645982;}
ol
        {margin-bottom:0cm;}
ul
        {margin-bottom:0cm;}
--></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-IE link=blue vlink=purple><div class=WordSection1><p class=MsoNormal><span style='font-family:"Book Antiqua",serif;color:#943634;mso-fareast-language:EN-US'>Yes, the PCH implementations I was thinking of are MSVC and GCC.  Despite working with CLang/LLVM all the time now, I have not actually used its PCH implementation so I don’t know how it behaves - I really should try it out.<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Book Antiqua",serif;color:#943634;mso-fareast-language:EN-US'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-family:"Book Antiqua",serif;color:#943634;mso-fareast-language:EN-US'>In the past I have had some very nasty bugs that were very difficult to analyse, and it turned out that a user declaration or macro had interfered with the behaviour of the ISO headers that were included after it.  In one case a C++ program ended up with a very subtle overloading change that resulted after a “clever” user data type was introduced that unintentionally altered how the overloading resolved in the definitions of some of the template function implementations.<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Book Antiqua",serif;color:#943634;mso-fareast-language:EN-US'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-family:"Book Antiqua",serif;color:#943634;mso-fareast-language:EN-US'>All the best,<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Book Antiqua",serif;color:#943634;mso-fareast-language:EN-US'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-family:"Book Antiqua",serif;color:#943634;mso-fareast-language:EN-US'>            MartinO<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Book Antiqua",serif;color:#943634;mso-fareast-language:EN-US'><o:p> </o:p></span></p><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'> David Blaikie [mailto:dblaikie@gmail.com] <br><b>Sent:</b> 10 September 2015 17:07<br><b>To:</b> Martin J. O'Riordan <martin.oriordan@movidius.com><br><b>Cc:</b> Russell Wallace <russell.wallace@gmail.com>; llvm-dev <llvm-dev@lists.llvm.org><br><b>Subject:</b> Re: [llvm-dev] LLVM coding standards and order of includes<o:p></o:p></span></p><p class=MsoNormal><o:p> </o:p></p><div><p class=MsoNormal><o:p> </o:p></p><div><p class=MsoNormal><o:p> </o:p></p><div><p class=MsoNormal>On Thu, Sep 10, 2015 at 9:00 AM, Martin J. O'Riordan <<a href="mailto:martin.oriordan@movidius.com" target="_blank">martin.oriordan@movidius.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'><div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Book Antiqua",serif;color:black'>Generally it is safer to include ISO headers first (using the ‘</span><span style='font-family:"Courier New";color:black'>#include <...></span><span style='font-family:"Book Antiqua",serif;color:black'>’ form) so as to minimise the possibility that a later user declaration or macro definition interferes with the correctness of the Standard libraries.  It also tends to make pre-compiled header implementations faster and more shareable across a larger set of files.</span><o:p></o:p></p></div></div></blockquote><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>As a complete aside, I'm curious which implementation of precompiled headers you're referring to. The only one I'm familiar with is MSVC's which requires a designated PCH that must be first, not just earlier. Generally we won't put a system header first, we'll put the corresponding .h for this .cpp file first - as a way to test that that header is standalone (ie: doesn't depend on any other inclusions before it)<br><br>(& FWIW Clang's modules support is a more general form of PCH that doesn't have these limitations - C++ support is ongoing, though)<o:p></o:p></p></div><div><p class=MsoNormal> <o:p></o:p></p></div><blockquote style='border:none;border-left:solid #CCCCCC 1.0pt;padding:0cm 0cm 0cm 6.0pt;margin-left:4.8pt;margin-right:0cm'><div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Book Antiqua",serif;color:black'> </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Book Antiqua",serif;color:black'>I would like to suggest revising the LLVM coding standard to place the “</span><span style='font-size:10.5pt;font-family:"Lucida Sans Unicode",sans-serif;color:black'>System </span><tt><span style='font-size:10.0pt;font-family:Consolas;color:black'>#include</span></tt><span style='font-size:10.5pt;font-family:"Lucida Sans Unicode",sans-serif;color:black'>s</span><span style='font-family:"Book Antiqua",serif;color:black'>” first.</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Book Antiqua",serif;color:black'> </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Book Antiqua",serif;color:black'>            MartinO</span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-family:"Book Antiqua",serif;color:#943634'> </span><o:p></o:p></p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><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'> llvm-dev [mailto:<a href="mailto:llvm-dev-bounces@lists.llvm.org" target="_blank">llvm-dev-bounces@lists.llvm.org</a>] <b>On Behalf Of </b>David Blaikie via llvm-dev<br><b>Sent:</b> 10 September 2015 16:33<br><b>To:</b> Russell Wallace <<a href="mailto:russell.wallace@gmail.com" target="_blank">russell.wallace@gmail.com</a>><br><b>Cc:</b> llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>><br><b>Subject:</b> Re: [llvm-dev] LLVM coding standards and order of includes</span><o:p></o:p></p><div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'> <o:p></o:p></p><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'> <o:p></o:p></p><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'> <o:p></o:p></p><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>On Thu, Sep 10, 2015 at 8:06 AM, Russell Wallace via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</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-top:5.0pt;margin-right:0cm;margin-bottom:5.0pt'><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>According to the LLVM coding standards,<o:p></o:p></p><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'> <o:p></o:p></p></div><div><p style='margin-bottom:6.0pt;line-height:15.75pt'><span style='font-size:10.5pt;font-family:"Lucida Sans Unicode",sans-serif;color:black'>Immediately after the <a href="http://llvm.org/docs/CodingStandards.html#header-file-comment" target="_blank"><span style='color:#CA7900'>header file comment</span></a> (and include guards if working on a header file), the <a href="http://llvm.org/docs/CodingStandards.html#minimal-list-of-includes" target="_blank"><span style='color:#CA7900'>minimal list of #includes</span></a>required by the file should be listed. We prefer these </span><tt><span style='font-size:10.0pt;font-family:Consolas;color:black'>#include</span></tt><span style='font-size:10.5pt;font-family:"Lucida Sans Unicode",sans-serif;color:black'>s to be listed in this order:</span><o:p></o:p></p><ol start=1 type=1><li class=MsoNormal style='color:black;mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;line-height:15.75pt;mso-list:l0 level1 lfo1'><span style='font-size:10.5pt;font-family:"Lucida Sans Unicode",sans-serif'>Main Module Header</span><o:p></o:p></li><li class=MsoNormal style='color:black;mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;line-height:15.75pt;mso-list:l0 level1 lfo1'><span style='font-size:10.5pt;font-family:"Lucida Sans Unicode",sans-serif'>Local/Private Headers</span><o:p></o:p></li><li class=MsoNormal style='color:black;mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;line-height:15.75pt;mso-list:l0 level1 lfo1'><tt><span style='font-size:10.0pt;font-family:Consolas'>llvm/...</span></tt><o:p></o:p></li><li class=MsoNormal style='color:black;mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;line-height:15.75pt;mso-list:l0 level1 lfo1'><span style='font-size:10.5pt;font-family:"Lucida Sans Unicode",sans-serif'>System </span><tt><span style='font-size:10.0pt;font-family:Consolas'>#include</span></tt><span style='font-size:10.5pt;font-family:"Lucida Sans Unicode",sans-serif'>s</span><o:p></o:p></li></ol><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><span style='font-size:10.5pt;font-family:"Lucida Sans Unicode",sans-serif;color:black'>If a program is using LLVM, and also using a third-party library such as GMP, where would the coding standard have the GMP include be placed relative to the above order?</span><o:p></o:p></p></div></div></div></blockquote><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><br>The LLVM coding conventions are really intended for LLVM's code itself, they probably don't cover many situations that would arise when using LLVM code in broader applications like this... (nor is it likely we'd want to add wording to the style guide to clarify those use cases, unfortunately).<br><br>That said, we do have one (zlib compression?) or two (maybe md5 too?) external libraries used in LLVM, I imagine they get bundled in with the system includes, but I've not looked (& given that there aren't many, they might not be done in any consistent/deliberate manner)<br><br>- Dave<o:p></o:p></p></div></div></div></div></div></div></div></div></blockquote></div><p class=MsoNormal><o:p> </o:p></p></div></div></div></body></html>