[clang] [clang] Implement P2582R1: CTAD from inherited constructors (PR #98788)
Aaron Ballman via cfe-commits
cfe-commits at lists.llvm.org
Thu Oct 31 08:40:23 PDT 2024
================
@@ -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()) {
----------------
AaronBallman wrote:
This seems wrong compared to the comment -- the comment says we should be looking at each explicit function argument, but this predicate only handles the case where both functions are variadic and have the same number of params.
Am I missing something?
https://github.com/llvm/llvm-project/pull/98788
More information about the cfe-commits
mailing list