================ @@ -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()) { ---------------- cor3ntin wrote:
We could assert that `getNumNonObjectParams` is `false` (I don't think we can get explicit objects anywhere, right? Otherwise, the code looks correct, but I agree that something like a "haveSameNonObjectParameters" function would improve readability 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