<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On 8 June 2017 at 03:22, Adam Nowacki via cfe-dev <span dir="ltr"><<a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">For C++ code:<br>
<br>
struct A {<br>
    operator int();<br>
};<br>
bool f() {<br>
    bool operator==(const A &, const A &);<br>
    return A() == A();<br>
}<br>
<br>
clang emits calls to A::operator int() and then performs the == comparison on ints - which is incorrect, only a call to operator==(const A &, const A &) should be emitted.</blockquote><div><br></div><div>Yes, this is a bug. Looks like we're not correctly putting the operator== function into IDNS_NonMemberOperator. We have this code in two places in Sema:</div><div><br></div><div>   if (Function->isOverloadedOperator() && !DC->isRecord() &&</div><div>      PrincipalDecl->isInIdentifierNamespace(Decl::IDNS_Ordinary))</div><div>    PrincipalDecl->setNonMemberOperator();</div><div><br></div><div>... which is wrong -- the above declaration is in IDNS_LocalExtern, not IDNS_Ordinary. If you're interested in putting together a patch for this, the fix might be as simple as changing the IDNS_Ordinary in these two cases to IDNS_Ordinary | IDNS_LocalExtern (you'll need to make sure that doesn't make the operator visible to operator lookups *outside* f(), though).</div></div></div></div>