<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)"><!--[if !mso]><style>v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
</style><![endif]--><style><!--
/* Font Definitions */
@font-face
        {font-family:Helvetica;
        panose-1:2 11 6 4 2 2 2 2 2 4;}
@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;}
/* 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;
        margin:0cm;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman",serif;}
span.EmailStyle18
        {mso-style-type:personal;
        font-family:"Book Antiqua",serif;
        color:#943634;
        font-weight:normal;
        font-style:normal;
        text-decoration:none none;}
span.EmailStyle19
        {mso-style-type:personal;
        font-family:"Book Antiqua",serif;
        color:#943634;
        font-weight:normal;
        font-style:normal;
        text-decoration:none none;}
span.EmailStyle20
        {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-size:10.0pt;}
@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-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'>It is fascinating that these words have been there since the original C++98 Standard, and we never noticed it before - a fresh pair of eyes are always good to show up unintended ambiguities.<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'>From the very formation of the Standards Committee in 1989, it was always our intention to preserve as much compatibility with C as possible so as to allow existing code written in C to be migrated to C++ with minimum hassle.  There are unavoidable things like new keywords, and the whole notion of scope changed, but on the whole I think that the committee did a good job at achieving this goal.  New keywords were always discussed at great depth, and in many cases obscure syntax that could not exist in C was used in preference to adding a new keyword.<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'>My suspicion is that the wording in “</span><span style='font-family:"Book Antiqua",serif;color:black;mso-fareast-language:EN-US'>D.5 C standard library headers [depr.c.headers]</span><span style='font-family:"Book Antiqua",serif;color:#943634;mso-fareast-language:EN-US'>” was written without quite thinking about the consequences that some of the names in C are now overloaded in C++.  Since C++ does not provide a form of using-declaration that can select discrete members from an overloaded name, it is not actually possible to achieve what was the intent of this section in the language, and why it used the “behaves as if” fuzzy wording rather than being explicit.  Section “</span><span style='font-family:"Book Antiqua",serif;color:black;mso-fareast-language:EN-US'>C.5 C standard library [diff.library]</span><span style='font-family:"Book Antiqua",serif;color:#943634;mso-fareast-language:EN-US'>” (non-normative) does try to list the set of difference, but curiously does not mention that many of the functions in ‘</span><span style='font-family:"Courier New";color:black;mso-fareast-language:EN-US'><math.h></span><span style='font-family:"Book Antiqua",serif;color:#943634;mso-fareast-language:EN-US'>’ are overloaded, nor that ‘</span><span style='font-family:"Courier New";color:black;mso-fareast-language:EN-US'>abs</span><span style='font-family:"Book Antiqua",serif;color:#943634;mso-fareast-language:EN-US'>’ from ‘</span><span style='font-family:"Courier New";color:black;mso-fareast-language:EN-US'><stdlib.h></span><span style='font-family:"Book Antiqua",serif;color:#943634;mso-fareast-language:EN-US'>’ is overloaded in both ‘</span><span style='font-family:"Courier New";color:black;mso-fareast-language:EN-US'><cstdlib></span><span style='font-family:"Book Antiqua",serif;color:#943634;mso-fareast-language:EN-US'>’ and ‘</span><span style='font-family:"Courier New";color:black;mso-fareast-language:EN-US'><cmath></span><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'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-family:"Book Antiqua",serif;color:#943634;mso-fareast-language:EN-US'>I completed a set of changes to these headers to restore the behaviour to that which people normally expect - I don’t know of another implementation which interprets these words as literally as has been exposed here - and that interpretation in English is perfectly valid.  When I ran my tests again with the modified versions, it did successfully correct the failing tests.  As I indicated in the first place, these are real world programs that will build successfully and as expected on all other platforms that we have used, some are existing programs ported from other targets, so it is not a target specific issue (leaving ‘</span><span style='font-family:"Courier New";color:black;mso-fareast-language:EN-US'>__fp16</span><span style='font-family:"Book Antiqua",serif;color:#943634;mso-fareast-language:EN-US'>’ aside; it was just ‘</span><span style='font-family:"Courier New";color:black;mso-fareast-language:EN-US'>__fp16</span><span style='font-family:"Book Antiqua",serif;color:#943634;mso-fareast-language:EN-US'>’ that drew my attention to it).<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'>I left the changes for names like ‘</span><span style='font-family:"Courier New";color:black;mso-fareast-language:EN-US'>fpclassify</span><span style='font-family:"Book Antiqua",serif;color:#943634;mso-fareast-language:EN-US'>’ as they are, overloaded in the global namespace because this looks like a perfectly acceptable way of manifesting a C macro implanted semantic in C++ using overloading, and I can’t think of an observable differences that a C program is likely to depend on.<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'>At first I thought that this was just an accident due to the refactoring of ‘</span><span style='font-family:"Courier New";color:black;mso-fareast-language:EN-US'><cmath></span><span style='font-family:"Book Antiqua",serif;color:#943634;mso-fareast-language:EN-US'>’ into ‘</span><span style='font-family:"Courier New";color:black;mso-fareast-language:EN-US'><cmath></span><span style='font-family:"Book Antiqua",serif;color:#943634;mso-fareast-language:EN-US'>’ and ‘</span><span style='font-family:"Courier New";color:black;mso-fareast-language:EN-US'><c++/math.h></span><span style='font-family:"Book Antiqua",serif;color:#943634;mso-fareast-language:EN-US'>’; but it is clear from this thread that it was an intentional act based on valid reading of this statement in the Standard; though in my opinion this is a bug in the Standard and never the intent.<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'>It has often been observed that the C++ Standard would have benefitted from the provision of a Rationale document as was provided with the C Standard, but C++ is a much larger and more complex language, and such a rationale would have taken considerable time and resources to write.<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'>Tomorrow I will synch up to the current head revision of the v3.8 branch and compute a patch file for these changes relative to that revision.  I can submit it to this list if a decision is made to accept this this change; I will have to make this change in my version either-way, as I have too many existing programs dependent on the commonly understood meaning.  Also, while I am no longer an active participant on the Standard, I will draw attention of this issue to some of my colleagues who are, so that they can discuss it in the formal context of C++17.<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'>Thanks,<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><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'> Hal Finkel [mailto:hfinkel@anl.gov] <br><b>Sent:</b> 24 January 2016 00:44<br><b>To:</b> Martin ORiordan <Martin.ORiordan@Movidius.com><br><b>Cc:</b> Marshall Clow <mclow.lists@gmail.com>; Richard Smith <richard@metafoo.co.uk>; Clang Dev <cfe-dev@lists.llvm.org>; Eric Fiselier <eric@efcs.ca><br><b>Subject:</b> Re: [cfe-dev] LibC++ v3.8 - Problems with ISO C wrapper headers<o:p></o:p></span></p></div></div><p class=MsoNormal><o:p> </o:p></p><div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial",sans-serif;color:black'><o:p> </o:p></span></p><div class=MsoNormal align=center style='text-align:center'><span style='font-size:10.0pt;font-family:"Arial",sans-serif;color:black'><hr size=2 width="100%" align=center id=zwchr></span></div><blockquote style='border:none;border-left:solid #1010FF 1.5pt;padding:0cm 0cm 0cm 4.0pt;margin-left:3.75pt;margin-top:5.0pt;margin-bottom:5.0pt'><p class=MsoNormal style='margin-bottom:12.0pt'><b><span style='font-family:"Helvetica",sans-serif;color:black'>From: </span></b><span style='font-family:"Helvetica",sans-serif;color:black'>"Martin J. O'Riordan" <<a href="mailto:martin.oriordan@movidius.com">martin.oriordan@movidius.com</a>><br><b>To: </b>"Hal Finkel" <<a href="mailto:hfinkel@anl.gov">hfinkel@anl.gov</a>><br><b>Cc: </b>"Marshall Clow" <<a href="mailto:mclow.lists@gmail.com">mclow.lists@gmail.com</a>>, "Richard Smith" <<a href="mailto:richard@metafoo.co.uk">richard@metafoo.co.uk</a>>, "Clang Dev" <<a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a>>, "Eric Fiselier" <<a href="mailto:eric@efcs.ca">eric@efcs.ca</a>><br><b>Sent: </b>Saturday, January 23, 2016 4:23:21 PM<br><b>Subject: </b>RE: [cfe-dev] LibC++ v3.8 - Problems with ISO C wrapper headers<o:p></o:p></span></p><p class=MsoNormal><b><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri",sans-serif;color:black'>From:</span></b><span lang=EN-US style='font-size:11.0pt;font-family:"Calibri",sans-serif;color:black'> Hal Finkel [<a href="mailto:hfinkel@anl.gov">mailto:hfinkel@anl.gov</a>] <br><b>Sent:</b> 23 January 2016 21:57<br><b>To:</b> Martin ORiordan <<a href="mailto:Martin.ORiordan@Movidius.com">Martin.ORiordan@Movidius.com</a>><br><b>Cc:</b> Marshall Clow <<a href="mailto:mclow.lists@gmail.com">mclow.lists@gmail.com</a>>; Richard Smith <<a href="mailto:richard@metafoo.co.uk">richard@metafoo.co.uk</a>>; Clang Dev <<a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a>>; Eric Fiselier <<a href="mailto:eric@efcs.ca">eric@efcs.ca</a>><br><b>Subject:</b> Re: [cfe-dev] LibC++ v3.8 - Problems with ISO C wrapper headers</span><span style='color:black'><o:p></o:p></span></p><p class=MsoNormal><span style='color:black'> <o:p></o:p></span></p><div><blockquote style='border:none;border-left:solid windowtext 1.5pt;padding:0cm 0cm 0cm 4.0pt;margin-left:3.75pt;margin-top:5.0pt;margin-bottom:5.0pt;border-color:-moz-use-text-color -moz-use-text-color -moz-use-text-color rgb(16, 16, 255)'><p class=MsoNormal><span style='font-family:"Book Antiqua",serif;color:#943634'>The effective code subtly changes silently from:</span><span style='color:black'><o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Book Antiqua",serif;color:#943634'> </span><span style='color:black'><o:p></o:p></span></p><p class=MsoNormal style='margin-left:36.0pt'><span style='font-family:"Courier New";color:black'>int x = abs((int)aBar.operator double());  // choosing ‘int ::abs(int)’</span><span style='color:black'><o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Book Antiqua",serif;color:#943634'>to:</span><span style='color:black'><o:p></o:p></span></p><p class=MsoNormal style='margin-left:36.0pt'><span style='font-family:"Courier New";color:black'>int x = (int)abs(aBar.operator double());  // choosing ‘double ::abs(double)’</span><span style='color:black'><o:p></o:p></span></p></blockquote><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial",sans-serif;color:black'>Of all of your examples, this is the most important. The other changes result in a compilation failure, and are easy to fix. However, it is certainly my experience that, in almost all cases, the semantic change you highlight is actually a silent bug *fix*, as the author almost always intended the behavior we now have, not the behavior we provided previously. Obviously this will not be 100% true, but on balance, the change has seems positive. Either way, good compiler warnings are essential. As I recall, Clang does have a good warning for this.<br><br> -Hal</span><span style='color:black'><o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Book Antiqua",serif;color:#943634'> </span><span style='color:black'><o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Book Antiqua",serif;color:#943634'>Hmm, yes and no.  If they wanted different behaviour, they should have included ‘</span><span style='font-family:"Courier New";color:black'><cmath></span><span style='font-family:"Book Antiqua",serif;color:#943634'>’ and not ‘</span><span style='font-family:"Courier New";color:black'><math.h></span><span style='font-family:"Book Antiqua",serif;color:#943634'>’.  It is not our place to assume to fix their possible intent.  An expert C++ programmer might expect exactly the C behaviour. </span><span style='color:black'><o:p></o:p></span></p></div></blockquote><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial",sans-serif;color:black'>I'd have a difficult time calling such an author an expert C++ programmer, as such a person would clearly understand how easy it would be for some future maintainer to break their code by a seemingly-innocuous improvement in which headers are included, or by placing the code in a different environment (e.g. by someone copying-and-pasting the code into some other file).<o:p></o:p></span></p><blockquote style='border:none;border-left:solid #1010FF 1.5pt;padding:0cm 0cm 0cm 4.0pt;margin-left:3.75pt;margin-top:5.0pt;margin-bottom:5.0pt'><div><p class=MsoNormal><span style='font-family:"Book Antiqua",serif;color:#943634'>  The very fact that they chose the C header</span><span style='color:black'><o:p></o:p></span></p></div></blockquote><p class=MsoNormal style='margin-bottom:12.0pt'><span style='font-size:10.0pt;font-family:"Arial",sans-serif;color:black'><br>But it is often not the choice of the original author, at least not intentionally.<o:p></o:p></span></p><blockquote style='border:none;border-left:solid #1010FF 1.5pt;padding:0cm 0cm 0cm 4.0pt;margin-left:3.75pt;margin-top:5.0pt;margin-bottom:5.0pt'><div><p class=MsoNormal><span style='font-family:"Book Antiqua",serif;color:#943634'>and not the C++ prescribed equivalent makes it more evident to me that this is the realm of the static analyser’s diagnostics, and not the realm of the Standard library implementation to assume it knows what they might have meant.</span><span style='color:black'><o:p></o:p></span></p></div></blockquote><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial",sans-serif;color:black'>I think your position is completely reasonable, but there happen to be strong practical advantages to the wording as-stated that are definitely worth considering (regardless of how we got here).<br><br> -Hal<o:p></o:p></span></p><blockquote style='border:none;border-left:solid #1010FF 1.5pt;padding:0cm 0cm 0cm 4.0pt;margin-left:3.75pt;margin-top:5.0pt;margin-bottom:5.0pt'><div><p class=MsoNormal><span style='font-family:"Book Antiqua",serif;color:#943634'> </span><span style='color:black'><o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Book Antiqua",serif;color:#943634'>            MartinO</span><span style='color:black'><o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Book Antiqua",serif;color:#943634'> </span><span style='color:black'><o:p></o:p></span></p></div></blockquote><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial",sans-serif;color:black'><br><br><br>-- <o:p></o:p></span></p><div><p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial",sans-serif;color:black'>Hal Finkel<br>Assistant Computational Scientist<br>Leadership Computing Facility<br>Argonne National Laboratory<o:p></o:p></span></p></div></div></div></body></html>