================
@@ -13252,6 +13273,33 @@ class AddressOfFunctionResolver {
     }
   }
 
+  void EliminateLessPartialOrderingConstrainedMatches() {
+    // C++ [over.over]p5:
+    //   [...] Any given non-template function F0 is eliminated if the set
+    //   contains a second non-template function that is more
+    //   partial-ordering-constrained than F0. [...]
+    assert(Matches[0].second->getPrimaryTemplate() == nullptr &&
+           "Call EliminateAllTemplateMatches() first");
+    SmallVector<std::pair<DeclAccessPair, FunctionDecl *>, 4> Results;
+    Results.push_back(Matches[0]);
+    for (unsigned I = 1, N = Matches.size(); I < N; ++I) {
+      assert(Matches[I].second->getPrimaryTemplate() == nullptr);
+      FunctionDecl *F = getMorePartialOrderingConstrained(
+          S, Matches[I].second, Results[0].second,
+          /*IsFn1Reversed=*/false,
+          /*IsFn2Reversed=*/false);
+      if (!F) {
+        Results.push_back(Matches[I]);
+        continue;
+      }
+      if (F == Matches[I].second) {
+        Results.clear();
+        Results.push_back(Matches[I]);
+      }
+    }
+    std::swap(Matches, Results);
----------------
zyn0217 wrote:

It is supposed to work, though I haven't yet devised a test to exercise that 
branch. My understanding is that if there were more than one candidate that 
isn't more constrained than the others, we should have ruled them out earlier 
when checking the full address-taken expression, namely in 
`resolveAddressOfSingleOverloadCandidate()`, whose logic is similar to this 
`AddressOfFunctionResolver::EliminateLessPartialOrderingConstrainedMatches`, 
which is mainly used for initialization stuff purpose.

We unfortunately ended up with these separate pieces of address-of resolution 
logic for different scenarios such as type deduction and initialization 
sequence construction. While we might be doing some redundant work, from my 
understanding, the function in its current form aligns with the standard's 
intent.

https://github.com/llvm/llvm-project/pull/127773
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to