<div dir="ltr"><div dir="ltr">On Tue, Jan 26, 2021 at 8:58 AM Nuno Lopes via cfe-dev <<a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a>> wrote:<br></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><br>
I just bumped into this mysterious behavior with the spaceship operator over<br>
optional:<br>
<br>
struct expr {<br>
  std::strong_ordering operator<=>(const expr &rhs) const;<br>
  //bool operator==(const expr &rhs) const;<br>
};<br>
<br>
int f() {<br>
  return std::is_eq(std::optional<expr>() <=> std::optional<expr>());<br>
  //return std::optional<expr>() == std::optional<expr>();<br>
}<br>
<br>
Function f() returns 0 both on gcc & clang trunk<br>
(<a href="https://gcc.godbolt.org/z/fv85eP" rel="noreferrer" target="_blank">https://gcc.godbolt.org/z/fv85eP</a>).<br>
However, if you uncomment the operator==() line, the function starts<br>
returning 1.<br>
<br>
The documentation of<br>
<a href="https://en.cppreference.com/w/cpp/utility/optional/operator_cmp" rel="noreferrer" target="_blank">https://en.cppreference.com/w/cpp/utility/optional/operator_cmp</a> just says:<br>
    7) If bool(lhs) && bool(rhs) is true returns *x <=> *y<br>
      Otherwise, returns bool(lhs) <=> bool(rhs)<br>
<br>
So no word about operator=='s existence.<br>
Is this a bug in both clang & gcc or just some unobvious 3-way comparison<br>
rule I'm not aware?<br></blockquote><div><br></div><div>I haven't dug deep, but based on your description it's an issue with <b>GNU libstdc++</b>, not an issue with either of the compilers themselves.</div><div>Neither libc++ nor Microsoft STL support C++20 optional::operator<=> yet; libstdc++ is the only library vendor who's tried to implement it, and if their implementation doesn't match your expectations, then my guess is that it's a bug in their implementation. (Or, perhaps, a bug in your expectations — but I give it more than 50/50 it's an implementation bug in libstdc++. The details of operator-spaceship have changed <i><b>many</b></i> times in the past 3 years and maybe GNU libstdc++ is implementing some older version.)</div><div><br></div><div><a href="https://gcc.godbolt.org/z/ofxPss">https://gcc.godbolt.org/z/ofxPss</a><br></div><div>My guess is that libstdc++ std::optional hasn't caught up to the compiler changes from</div><div><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1185r2.html">http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1185r2.html</a></div><div><br></div><div>HTH,</div><div>Arthur</div><div><br></div></div></div>