================
@@ -10615,6 +10615,40 @@ bool clang::isBetterOverloadCandidate(
     auto *Guide1 = dyn_cast_or_null<CXXDeductionGuideDecl>(Cand1.Function);
     auto *Guide2 = dyn_cast_or_null<CXXDeductionGuideDecl>(Cand2.Function);
     if (Guide1 && Guide2) {
+      //  -- F1 and F2 are generated from class template argument deduction
+      //  for a class D, and F2 is generated from inheriting constructors
+      //  from a base class of D while F1 is not, ...
+      bool G1Inherited = Guide1->getSourceDeductionGuide() &&
+                         Guide1->getSourceDeductionGuideKind() ==
+                             CXXDeductionGuideDecl::SourceDeductionGuideKind::
+                                 InheritedConstructor;
+      bool G2Inherited = Guide2->getSourceDeductionGuide() &&
+                         Guide2->getSourceDeductionGuideKind() ==
+                             CXXDeductionGuideDecl::SourceDeductionGuideKind::
+                                 InheritedConstructor;
+      if (Guide1->isImplicit() && Guide2->isImplicit() &&
+          G1Inherited != G2Inherited) {
+        const FunctionProtoType *FPT1 =
+            Guide1->getType()->getAs<FunctionProtoType>();
+        const FunctionProtoType *FPT2 =
+            Guide2->getType()->getAs<FunctionProtoType>();
+        assert(FPT1 && FPT2);
+
+        // ... and for each explicit function argument, the parameters of F1 
and
+        // F2 are either both ellipses or have the same type
+        if (FPT1->isVariadic() == FPT2->isVariadic() &&
+            FPT1->getNumParams() == FPT2->getNumParams()) {
----------------
antangelo wrote:

To my understanding of the implications of the wording, if they do not have the 
same number of parameters, then at least one of the parameters must not have 
the same type (since the corresponding parameter in the other function wouldn't 
exist). If this is the case, then we don't need to do the work of checking all 
the parameters individually.

The variadic check is that the functions are either both variadic, or both not 
variadic, for handling of the ellipses parameters.

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

Reply via email to