<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:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        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.MsoPlainText, li.MsoPlainText, div.MsoPlainText
        {mso-style-priority:99;
        mso-style-link:"Plain Text Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
p.Code, li.Code, div.Code
        {mso-style-name:Code;
        mso-style-link:"Code Char";
        margin:0in;
        margin-bottom:.0001pt;
        border:none;
        padding:0in;
        font-size:12.0pt;
        font-family:Consolas;
        color:#404040;}
span.CodeChar
        {mso-style-name:"Code Char";
        mso-style-link:Code;
        font-family:Consolas;
        color:#404040;}
p.MailQuote, li.MailQuote, div.MailQuote
        {mso-style-name:MailQuote;
        mso-style-link:"MailQuote Char";
        margin:0in;
        margin-bottom:.0001pt;
        border:none;
        padding:0in;
        font-size:12.0pt;
        font-family:"Calibri",sans-serif;}
span.MailQuoteChar
        {mso-style-name:"MailQuote Char";
        mso-style-link:MailQuote;
        font-family:"Calibri",sans-serif;}
p.msonormal0, li.msonormal0, div.msonormal0
        {mso-style-name:msonormal;
        mso-margin-top-alt:auto;
        margin-right:0in;
        mso-margin-bottom-alt:auto;
        margin-left:0in;
        font-size:12.0pt;
        font-family:"Times New Roman",serif;}
p.m-2865762710056028528m3575411032359691794code, li.m-2865762710056028528m3575411032359691794code, div.m-2865762710056028528m3575411032359691794code
        {mso-style-name:m_-2865762710056028528m_3575411032359691794code;
        mso-margin-top-alt:auto;
        margin-right:0in;
        mso-margin-bottom-alt:auto;
        margin-left:0in;
        font-size:12.0pt;
        font-family:"Times New Roman",serif;}
span.EmailStyle23
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
span.PlainTextChar
        {mso-style-name:"Plain Text Char";
        mso-style-priority:99;
        mso-style-link:"Plain Text";
        font-family:"Calibri",sans-serif;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
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-US" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoPlainText">I agree. Clang should warn in this case. If 'const' is changed to 'volatile', then gcc doesn't warn either (as expected).<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">I will file a bug.<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">/Riyaz<o:p></o:p></p>
<p class="MsoNormal"><a name="_MailEndCompose"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"><o:p> </o:p></span></a></p>
<span style="mso-bookmark:_MailEndCompose"></span>
<p class="MsoNormal"><b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">From:</span></b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> Matthew Del Buono [mailto:mpdelbuono@gmail.com]
<br>
<b>Sent:</b> Thursday, April 12, 2018 9:29 AM<br>
<b>To:</b> Maurizio Vitale <mav@uber.com><br>
<b>Cc:</b> Riyaz Puthiyapurayil <Riyaz.Puthiyapurayil@synopsys.com>; cfe-dev@lists.llvm.org<br>
<b>Subject:</b> Re: [cfe-dev] Clang tautological-compare fails to warn in cases where gcc doesn't<o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal">It's not volatile, so it seems inappropriate for clang to think that it could be modified in between. In fact, at -O1, the comparisons are optimized out anyway, so it's clear that the warning should be in place to tell developers that this
 comparison is not going to be performed:<o:p></o:p></p>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<div>
<div>
<p class="MsoNormal" style="background:#FFFFFE"><span style="color:teal">cmp(Foo const*, Foo const*):</span><span style="color:black">
</span><span style="color:green"># @cmp(Foo const*, Foo const*)</span><span style="color:black"><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="background:#FFFFFE"><span style="color:blue">xor</span><span style="color:black">
</span><span style="color:#4864AA">eax</span><span style="color:black">, </span><span style="color:#4864AA">eax</span><span style="color:black"><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="background:#FFFFFE"><span style="color:blue">ret</span><span style="color:black"><o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">(clang 6.0.0)<o:p></o:p></p>
</div>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal">On Thu, Apr 12, 2018 at 8:35 AM, Maurizio Vitale via cfe-dev <<a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a>> wrote:<o:p></o:p></p>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in">
<div>
<p class="MsoNormal">I suspect that clang cannot satisfy itself that the x->a cannot be changed by somebody else between the evaluation of the lhs and the rhs of the comparison.<o:p></o:p></p>
<div>
<p class="MsoNormal">All it knows is that the function cmp cannot modify it.<br>
I'd say clang is correct, but I haven't studied the problem much.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Maurizio<o:p></o:p></p>
</div>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<div>
<div>
<p class="MsoNormal">On Thu, Apr 12, 2018 at 10:39 AM, Riyaz Puthiyapurayil via cfe-dev <<a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a>> wrote:<o:p></o:p></p>
</div>
</div>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in">
<div>
<div>
<div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">Here is a simple test where clang fails to issue a warning in the first function but warns in the second function. gcc (6.x and above) gives a warning in both cases. Is the pointer
 dereference throwing clang off? Why should the pointer dereference matter in this case?
<o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
<div style="border:solid #F2F2F2 1.0pt;padding:1.0pt 4.0pt 1.0pt 4.0pt">
<p class="m-2865762710056028528m3575411032359691794code">struct Foo {<o:p></o:p></p>
<p class="m-2865762710056028528m3575411032359691794code">    int a;<o:p></o:p></p>
<p class="m-2865762710056028528m3575411032359691794code">};<o:p></o:p></p>
<p class="m-2865762710056028528m3575411032359691794code"> <o:p></o:p></p>
<p class="m-2865762710056028528m3575411032359691794code">// Case 1<o:p></o:p></p>
<p class="m-2865762710056028528m3575411032359691794code">int cmp(const Foo* x, const Foo* y);<o:p></o:p></p>
<p class="m-2865762710056028528m3575411032359691794code">int cmp(const Foo* x, const Foo* y)<o:p></o:p></p>
<p class="m-2865762710056028528m3575411032359691794code">{<o:p></o:p></p>
<p class="m-2865762710056028528m3575411032359691794code">    if (x->a < x->a) {<o:p></o:p></p>
<p class="m-2865762710056028528m3575411032359691794code">        return -1;<o:p></o:p></p>
<p class="m-2865762710056028528m3575411032359691794code">    } else if (y->a > y->a) {<o:p></o:p></p>
<p class="m-2865762710056028528m3575411032359691794code">        return 1;<o:p></o:p></p>
<p class="m-2865762710056028528m3575411032359691794code">    }<o:p></o:p></p>
<p class="m-2865762710056028528m3575411032359691794code">    return 0;<o:p></o:p></p>
<p class="m-2865762710056028528m3575411032359691794code">}<o:p></o:p></p>
<p class="m-2865762710056028528m3575411032359691794code"> <o:p></o:p></p>
<p class="m-2865762710056028528m3575411032359691794code">// Case 2<o:p></o:p></p>
<p class="m-2865762710056028528m3575411032359691794code">int cmp2(int x, int y);<o:p></o:p></p>
<p class="m-2865762710056028528m3575411032359691794code">int cmp2(int x, int y)<o:p></o:p></p>
<p class="m-2865762710056028528m3575411032359691794code">{<o:p></o:p></p>
<p class="m-2865762710056028528m3575411032359691794code">    if (x < x) {<o:p></o:p></p>
<p class="m-2865762710056028528m3575411032359691794code">        return -1;<o:p></o:p></p>
<p class="m-2865762710056028528m3575411032359691794code">    } else if (y > y) {<o:p></o:p></p>
<p class="m-2865762710056028528m3575411032359691794code">        return 1;<o:p></o:p></p>
<p class="m-2865762710056028528m3575411032359691794code">    }<o:p></o:p></p>
<p class="m-2865762710056028528m3575411032359691794code">    return 0;<o:p></o:p></p>
<p class="m-2865762710056028528m3575411032359691794code">}<o:p></o:p></p>
<p class="m-2865762710056028528m3575411032359691794code"> <o:p></o:p></p>
<p class="m-2865762710056028528m3575411032359691794code">// gcc 6.2 with -Wall<o:p></o:p></p>
<p class="m-2865762710056028528m3575411032359691794code">x.cc: In function ?int cmp(const Foo*, const Foo*)?:<o:p></o:p></p>
<p class="m-2865762710056028528m3575411032359691794code">x.cc:7:14: warning: self-comparison always evaluates to false [-Wtautological-compare]<o:p></o:p></p>
<p class="m-2865762710056028528m3575411032359691794code">     if (x->a < x->a) {<o:p></o:p></p>
<p class="m-2865762710056028528m3575411032359691794code">         ~~~~~^~~~~~<o:p></o:p></p>
<p class="m-2865762710056028528m3575411032359691794code">x.cc:9:21: warning: self-comparison always evaluates to false [-Wtautological-compare]<o:p></o:p></p>
<p class="m-2865762710056028528m3575411032359691794code">     } else if (y->a > y->a) {<o:p></o:p></p>
<p class="m-2865762710056028528m3575411032359691794code">                ~~~~~^~~~~~<o:p></o:p></p>
<p class="m-2865762710056028528m3575411032359691794code">x.cc: In function ?int cmp2(int, int)?:<o:p></o:p></p>
<p class="m-2865762710056028528m3575411032359691794code">x.cc:17:11: warning: self-comparison always evaluates to false [-Wtautological-compare]<o:p></o:p></p>
<p class="m-2865762710056028528m3575411032359691794code">     if (x < x) {<o:p></o:p></p>
<p class="m-2865762710056028528m3575411032359691794code">         ~~^~~<o:p></o:p></p>
<p class="m-2865762710056028528m3575411032359691794code">x.cc:19:18: warning: self-comparison always evaluates to false [-Wtautological-compare]<o:p></o:p></p>
<p class="m-2865762710056028528m3575411032359691794code">     } else if (y > y) {<o:p></o:p></p>
<p class="m-2865762710056028528m3575411032359691794code">                ~~^~~<o:p></o:p></p>
<p class="m-2865762710056028528m3575411032359691794code"> <o:p></o:p></p>
<p class="m-2865762710056028528m3575411032359691794code">// clang 6.0.1 -Wall<o:p></o:p></p>
<p class="m-2865762710056028528m3575411032359691794code">x.cc:17:11: warning: self-comparison always evaluates to false [-Wtautological-compare]<o:p></o:p></p>
<p class="m-2865762710056028528m3575411032359691794code">    if (x < x) {<o:p></o:p></p>
<p class="m-2865762710056028528m3575411032359691794code">          ^<o:p></o:p></p>
<p class="m-2865762710056028528m3575411032359691794code">x.cc:19:18: warning: self-comparison always evaluates to false [-Wtautological-compare]<o:p></o:p></p>
<p class="m-2865762710056028528m3575411032359691794code">    } else if (y > y) {<o:p></o:p></p>
<p class="m-2865762710056028528m3575411032359691794code">                 ^<o:p></o:p></p>
<p class="m-2865762710056028528m3575411032359691794code">2 warnings generated.<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>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</div>
<p class="MsoNormal" style="margin-bottom:12.0pt">_______________________________________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a><br>
<a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__lists.llvm.org_cgi-2Dbin_mailman_listinfo_cfe-2Ddev&d=DwMFaQ&c=DPL6_X_6JkXFx7AXWqB0tg&r=mMZWMrEZcvPMLSsEQSah9FOTwza1UudSDkAneN47U9lD3qu6gt3kpnIb4MWV77cM&m=AQn-peRFphfxCRAi2gdLzc1TRpzAeWxKBR6gbFaKHNg&s=03282vflfI1Ee2bIGudRge2mczWrBmfzXyi2t8hxBqI&e=" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev</a><o:p></o:p></p>
</blockquote>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<p class="MsoNormal" style="margin-bottom:12.0pt"><br>
_______________________________________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a><br>
<a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__lists.llvm.org_cgi-2Dbin_mailman_listinfo_cfe-2Ddev&d=DwMFaQ&c=DPL6_X_6JkXFx7AXWqB0tg&r=mMZWMrEZcvPMLSsEQSah9FOTwza1UudSDkAneN47U9lD3qu6gt3kpnIb4MWV77cM&m=AQn-peRFphfxCRAi2gdLzc1TRpzAeWxKBR6gbFaKHNg&s=03282vflfI1Ee2bIGudRge2mczWrBmfzXyi2t8hxBqI&e=" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev</a><o:p></o:p></p>
</blockquote>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</div>
</body>
</html>