@@ -6917,7 +6917,8 @@ void Sema::AddOverloadCandidate(
69176917 OverloadCandidateSet &CandidateSet, bool SuppressUserConversions,
69186918 bool PartialOverloading, bool AllowExplicit, bool AllowExplicitConversions,
69196919 ADLCallKind IsADLCandidate, ConversionSequenceList EarlyConversions,
6920- OverloadCandidateParamOrder PO, bool AggregateCandidateDeduction) {
6920+ OverloadCandidateParamOrder PO, bool AggregateCandidateDeduction,
6921+ bool HasMatchedPackOnParmToNonPackOnArg) {
69216922 const FunctionProtoType *Proto
69226923 = dyn_cast<FunctionProtoType>(Function->getType()->getAs<FunctionType>());
69236924 assert(Proto && "Functions without a prototype cannot be overloaded");
@@ -6936,7 +6937,8 @@ void Sema::AddOverloadCandidate(
69366937 AddMethodCandidate(Method, FoundDecl, Method->getParent(), QualType(),
69376938 Expr::Classification::makeSimpleLValue(), Args,
69386939 CandidateSet, SuppressUserConversions,
6939- PartialOverloading, EarlyConversions, PO);
6940+ PartialOverloading, EarlyConversions, PO,
6941+ HasMatchedPackOnParmToNonPackOnArg);
69406942 return;
69416943 }
69426944 // We treat a constructor like a non-member function, since its object
@@ -6979,6 +6981,8 @@ void Sema::AddOverloadCandidate(
69796981 CandidateSet.getRewriteInfo().getRewriteKind(Function, PO);
69806982 Candidate.IsADLCandidate = llvm::to_underlying(IsADLCandidate);
69816983 Candidate.ExplicitCallArguments = Args.size();
6984+ Candidate.HasMatchedPackOnParmToNonPackOnArg =
6985+ HasMatchedPackOnParmToNonPackOnArg;
69826986
69836987 // Explicit functions are not actually candidates at all if we're not
69846988 // allowing them in this context, but keep them around so we can point
@@ -7521,16 +7525,13 @@ void Sema::AddMethodCandidate(DeclAccessPair FoundDecl, QualType ObjectType,
75217525 }
75227526}
75237527
7524- void
7525- Sema::AddMethodCandidate(CXXMethodDecl *Method, DeclAccessPair FoundDecl,
7526- CXXRecordDecl *ActingContext, QualType ObjectType,
7527- Expr::Classification ObjectClassification,
7528- ArrayRef<Expr *> Args,
7529- OverloadCandidateSet &CandidateSet,
7530- bool SuppressUserConversions,
7531- bool PartialOverloading,
7532- ConversionSequenceList EarlyConversions,
7533- OverloadCandidateParamOrder PO) {
7528+ void Sema::AddMethodCandidate(
7529+ CXXMethodDecl *Method, DeclAccessPair FoundDecl,
7530+ CXXRecordDecl *ActingContext, QualType ObjectType,
7531+ Expr::Classification ObjectClassification, ArrayRef<Expr *> Args,
7532+ OverloadCandidateSet &CandidateSet, bool SuppressUserConversions,
7533+ bool PartialOverloading, ConversionSequenceList EarlyConversions,
7534+ OverloadCandidateParamOrder PO, bool HasMatchedPackOnParmToNonPackOnArg) {
75347535 const FunctionProtoType *Proto
75357536 = dyn_cast<FunctionProtoType>(Method->getType()->getAs<FunctionType>());
75367537 assert(Proto && "Methods without a prototype cannot be overloaded");
@@ -7561,6 +7562,8 @@ Sema::AddMethodCandidate(CXXMethodDecl *Method, DeclAccessPair FoundDecl,
75617562 Candidate.TookAddressOfOverload =
75627563 CandidateSet.getKind() == OverloadCandidateSet::CSK_AddressOfOverloadSet;
75637564 Candidate.ExplicitCallArguments = Args.size();
7565+ Candidate.HasMatchedPackOnParmToNonPackOnArg =
7566+ HasMatchedPackOnParmToNonPackOnArg;
75647567
75657568 bool IgnoreExplicitObject =
75667569 (Method->isExplicitObjectMemberFunction() &&
@@ -7731,8 +7734,8 @@ void Sema::AddMethodTemplateCandidate(
77317734 ConversionSequenceList Conversions;
77327735 if (TemplateDeductionResult Result = DeduceTemplateArguments(
77337736 MethodTmpl, ExplicitTemplateArgs, Args, Specialization, Info,
7734- PartialOverloading, /*AggregateDeductionCandidate=*/false, ObjectType,
7735- ObjectClassification,
7737+ PartialOverloading, /*AggregateDeductionCandidate=*/false,
7738+ /*PartialOrdering=*/false, ObjectType, ObjectClassification,
77367739 [&](ArrayRef<QualType> ParamTypes) {
77377740 return CheckNonDependentConversions(
77387741 MethodTmpl, ParamTypes, Args, CandidateSet, Conversions,
@@ -7770,7 +7773,8 @@ void Sema::AddMethodTemplateCandidate(
77707773 AddMethodCandidate(cast<CXXMethodDecl>(Specialization), FoundDecl,
77717774 ActingContext, ObjectType, ObjectClassification, Args,
77727775 CandidateSet, SuppressUserConversions, PartialOverloading,
7773- Conversions, PO);
7776+ Conversions, PO,
7777+ Info.hasMatchedPackOnParmToNonPackOnArg());
77747778}
77757779
77767780/// Determine whether a given function template has a simple explicit specifier
@@ -7816,6 +7820,7 @@ void Sema::AddTemplateOverloadCandidate(
78167820 if (TemplateDeductionResult Result = DeduceTemplateArguments(
78177821 FunctionTemplate, ExplicitTemplateArgs, Args, Specialization, Info,
78187822 PartialOverloading, AggregateCandidateDeduction,
7823+ /*PartialOrdering=*/false,
78197824 /*ObjectType=*/QualType(),
78207825 /*ObjectClassification=*/Expr::Classification(),
78217826 [&](ArrayRef<QualType> ParamTypes) {
@@ -7856,7 +7861,8 @@ void Sema::AddTemplateOverloadCandidate(
78567861 Specialization, FoundDecl, Args, CandidateSet, SuppressUserConversions,
78577862 PartialOverloading, AllowExplicit,
78587863 /*AllowExplicitConversions=*/false, IsADLCandidate, Conversions, PO,
7859- Info.AggregateDeductionCandidateHasMismatchedArity);
7864+ Info.AggregateDeductionCandidateHasMismatchedArity,
7865+ Info.hasMatchedPackOnParmToNonPackOnArg());
78607866}
78617867
78627868bool Sema::CheckNonDependentConversions(
@@ -7978,7 +7984,8 @@ void Sema::AddConversionCandidate(
79787984 CXXConversionDecl *Conversion, DeclAccessPair FoundDecl,
79797985 CXXRecordDecl *ActingContext, Expr *From, QualType ToType,
79807986 OverloadCandidateSet &CandidateSet, bool AllowObjCConversionOnExplicit,
7981- bool AllowExplicit, bool AllowResultConversion) {
7987+ bool AllowExplicit, bool AllowResultConversion,
7988+ bool HasMatchedPackOnParmToNonPackOnArg) {
79827989 assert(!Conversion->getDescribedFunctionTemplate() &&
79837990 "Conversion function templates use AddTemplateConversionCandidate");
79847991 QualType ConvType = Conversion->getConversionType().getNonReferenceType();
@@ -8023,6 +8030,8 @@ void Sema::AddConversionCandidate(
80238030 Candidate.FinalConversion.setAllToTypes(ToType);
80248031 Candidate.Viable = true;
80258032 Candidate.ExplicitCallArguments = 1;
8033+ Candidate.HasMatchedPackOnParmToNonPackOnArg =
8034+ HasMatchedPackOnParmToNonPackOnArg;
80268035
80278036 // Explicit functions are not actually candidates at all if we're not
80288037 // allowing them in this context, but keep them around so we can point
@@ -8224,7 +8233,8 @@ void Sema::AddTemplateConversionCandidate(
82248233 assert(Specialization && "Missing function template specialization?");
82258234 AddConversionCandidate(Specialization, FoundDecl, ActingDC, From, ToType,
82268235 CandidateSet, AllowObjCConversionOnExplicit,
8227- AllowExplicit, AllowResultConversion);
8236+ AllowExplicit, AllowResultConversion,
8237+ Info.hasMatchedPackOnParmToNonPackOnArg());
82288238}
82298239
82308240void Sema::AddSurrogateCandidate(CXXConversionDecl *Conversion,
@@ -10576,6 +10586,10 @@ bool clang::isBetterOverloadCandidate(
1057610586 isa<CXXConstructorDecl>(Cand2.Function))
1057710587 return isa<CXXConstructorDecl>(Cand1.Function);
1057810588
10589+ if (Cand1.HasMatchedPackOnParmToNonPackOnArg !=
10590+ Cand2.HasMatchedPackOnParmToNonPackOnArg)
10591+ return Cand2.HasMatchedPackOnParmToNonPackOnArg;
10592+
1057910593 // -- F1 is a non-template function and F2 is a function template
1058010594 // specialization, or, if not that,
1058110595 bool Cand1IsSpecialization = Cand1.Function &&
0 commit comments