EricWF added inline comments.

================
Comment at: lib/Sema/SemaOverload.cpp:9218-9219
+    // --- F2 is a rewritten candidate ([over.match.oper]) and F1 is not.
+    if (Cand2.getRewrittenKind() && !Cand1.getRewrittenKind())
+      return true;
+    if (Cand1.getRewrittenKind() && Cand2.getRewrittenKind() &&
----------------
rsmith wrote:
> EricWF wrote:
> > EricWF wrote:
> > > EricWF wrote:
> > > > rsmith wrote:
> > > > > You also need to check the reverse condition and return false (the 
> > > > > "or if not that" is ... somehow ... supposed to imply that).
> > > > Hmm. So I'm wondering what is intended by the language `F1 and F2 are 
> > > > rewritten candidates, and F2 is a synthesized candidate with reversed 
> > > > order of parameters and F1 is not`. For example, what happens when 
> > > > comparing two distinct member functions with only one explicit 
> > > > parameter?
> > > > 
> > > > ```
> > > > struct T;
> > > > struct U { auto operator<=>(T); };
> > > > struct T { auto operator<=>(U); };
> > > > auto r = T{} < U{}; // Are the synthesized and rewritten overloads 
> > > > ambiguous? 
> > > > ```
> > > And what about 
> > > 
> > > ```
> > > struct U {};
> > > struct T { auto operator<=>(U); };
> > > auto operator<=>(U, T);
> > > auto r = T{} < U{};
> > > ```
> > Nevermind. I found the language. The implicit object parameter isn't 
> > considered in this case. 
> The parameters in scope in this rule are the parameters for the purpose of 
> overload resolution, which include the implicit object parameter for a member 
> function.
> 
> In your first example, both candidates have implicit conversion sequences 
> with Exact Match rank for both parameters (and none of the ordering special 
> cases apply), so we fall down to this tie-breaker and it selects the 
> `T::operator<=>(U)` candidate, unless I'm missing something.
> 
> Your second example appears to receive the same treatment.
Alright. So I found the wrong language. 

I think my first case meant to have `const &` parameters and `const` methods. 
That way the implicit object parameter type matched the reversed parameter 
type. The second example was meant to demonstrate the case where the implicit 
object parameter type doesn't match.

What type should we be comparing against in these cases?


Repository:
  rC Clang

https://reviews.llvm.org/D45680



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to