@@ -6864,7 +6864,8 @@ void Sema::AddOverloadCandidate(
68646864 OverloadCandidateSet &CandidateSet, bool SuppressUserConversions,
68656865 bool PartialOverloading, bool AllowExplicit, bool AllowExplicitConversions,
68666866 ADLCallKind IsADLCandidate, ConversionSequenceList EarlyConversions,
6867- OverloadCandidateParamOrder PO, bool AggregateCandidateDeduction) {
6867+ OverloadCandidateParamOrder PO, bool AggregateCandidateDeduction,
6868+ bool HasMatchedPackOnParmToNonPackOnArg) {
68686869 const FunctionProtoType *Proto
68696870 = dyn_cast<FunctionProtoType>(Function->getType()->getAs<FunctionType>());
68706871 assert(Proto && "Functions without a prototype cannot be overloaded");
@@ -6883,7 +6884,8 @@ void Sema::AddOverloadCandidate(
68836884 AddMethodCandidate(Method, FoundDecl, Method->getParent(), QualType(),
68846885 Expr::Classification::makeSimpleLValue(), Args,
68856886 CandidateSet, SuppressUserConversions,
6886- PartialOverloading, EarlyConversions, PO);
6887+ PartialOverloading, EarlyConversions, PO,
6888+ HasMatchedPackOnParmToNonPackOnArg);
68876889 return;
68886890 }
68896891 // We treat a constructor like a non-member function, since its object
@@ -6926,6 +6928,8 @@ void Sema::AddOverloadCandidate(
69266928 CandidateSet.getRewriteInfo().getRewriteKind(Function, PO);
69276929 Candidate.IsADLCandidate = IsADLCandidate;
69286930 Candidate.ExplicitCallArguments = Args.size();
6931+ Candidate.HasMatchedPackOnParmToNonPackOnArg =
6932+ HasMatchedPackOnParmToNonPackOnArg;
69296933
69306934 // Explicit functions are not actually candidates at all if we're not
69316935 // allowing them in this context, but keep them around so we can point
@@ -7453,16 +7457,13 @@ void Sema::AddMethodCandidate(DeclAccessPair FoundDecl, QualType ObjectType,
74537457 }
74547458}
74557459
7456- void
7457- Sema::AddMethodCandidate(CXXMethodDecl *Method, DeclAccessPair FoundDecl,
7458- CXXRecordDecl *ActingContext, QualType ObjectType,
7459- Expr::Classification ObjectClassification,
7460- ArrayRef<Expr *> Args,
7461- OverloadCandidateSet &CandidateSet,
7462- bool SuppressUserConversions,
7463- bool PartialOverloading,
7464- ConversionSequenceList EarlyConversions,
7465- OverloadCandidateParamOrder PO) {
7460+ void Sema::AddMethodCandidate(
7461+ CXXMethodDecl *Method, DeclAccessPair FoundDecl,
7462+ CXXRecordDecl *ActingContext, QualType ObjectType,
7463+ Expr::Classification ObjectClassification, ArrayRef<Expr *> Args,
7464+ OverloadCandidateSet &CandidateSet, bool SuppressUserConversions,
7465+ bool PartialOverloading, ConversionSequenceList EarlyConversions,
7466+ OverloadCandidateParamOrder PO, bool HasMatchedPackOnParmToNonPackOnArg) {
74667467 const FunctionProtoType *Proto
74677468 = dyn_cast<FunctionProtoType>(Method->getType()->getAs<FunctionType>());
74687469 assert(Proto && "Methods without a prototype cannot be overloaded");
@@ -7493,6 +7494,8 @@ Sema::AddMethodCandidate(CXXMethodDecl *Method, DeclAccessPair FoundDecl,
74937494 Candidate.TookAddressOfOverload =
74947495 CandidateSet.getKind() == OverloadCandidateSet::CSK_AddressOfOverloadSet;
74957496 Candidate.ExplicitCallArguments = Args.size();
7497+ Candidate.HasMatchedPackOnParmToNonPackOnArg =
7498+ HasMatchedPackOnParmToNonPackOnArg;
74967499
74977500 bool IgnoreExplicitObject =
74987501 (Method->isExplicitObjectMemberFunction() &&
@@ -7663,8 +7666,8 @@ void Sema::AddMethodTemplateCandidate(
76637666 ConversionSequenceList Conversions;
76647667 if (TemplateDeductionResult Result = DeduceTemplateArguments(
76657668 MethodTmpl, ExplicitTemplateArgs, Args, Specialization, Info,
7666- PartialOverloading, /*AggregateDeductionCandidate=*/false, ObjectType,
7667- ObjectClassification,
7669+ PartialOverloading, /*AggregateDeductionCandidate=*/false,
7670+ /*PartialOrdering=*/false, ObjectType, ObjectClassification,
76687671 [&](ArrayRef<QualType> ParamTypes) {
76697672 return CheckNonDependentConversions(
76707673 MethodTmpl, ParamTypes, Args, CandidateSet, Conversions,
@@ -7702,7 +7705,8 @@ void Sema::AddMethodTemplateCandidate(
77027705 AddMethodCandidate(cast<CXXMethodDecl>(Specialization), FoundDecl,
77037706 ActingContext, ObjectType, ObjectClassification, Args,
77047707 CandidateSet, SuppressUserConversions, PartialOverloading,
7705- Conversions, PO);
7708+ Conversions, PO,
7709+ Info.hasMatchedPackOnParmToNonPackOnArg());
77067710}
77077711
77087712/// Determine whether a given function template has a simple explicit specifier
@@ -7748,6 +7752,7 @@ void Sema::AddTemplateOverloadCandidate(
77487752 if (TemplateDeductionResult Result = DeduceTemplateArguments(
77497753 FunctionTemplate, ExplicitTemplateArgs, Args, Specialization, Info,
77507754 PartialOverloading, AggregateCandidateDeduction,
7755+ /*PartialOrdering=*/false,
77517756 /*ObjectType=*/QualType(),
77527757 /*ObjectClassification=*/Expr::Classification(),
77537758 [&](ArrayRef<QualType> ParamTypes) {
@@ -7788,7 +7793,8 @@ void Sema::AddTemplateOverloadCandidate(
77887793 Specialization, FoundDecl, Args, CandidateSet, SuppressUserConversions,
77897794 PartialOverloading, AllowExplicit,
77907795 /*AllowExplicitConversions=*/false, IsADLCandidate, Conversions, PO,
7791- Info.AggregateDeductionCandidateHasMismatchedArity);
7796+ Info.AggregateDeductionCandidateHasMismatchedArity,
7797+ Info.hasMatchedPackOnParmToNonPackOnArg());
77927798}
77937799
77947800bool Sema::CheckNonDependentConversions(
@@ -7910,7 +7916,8 @@ void Sema::AddConversionCandidate(
79107916 CXXConversionDecl *Conversion, DeclAccessPair FoundDecl,
79117917 CXXRecordDecl *ActingContext, Expr *From, QualType ToType,
79127918 OverloadCandidateSet &CandidateSet, bool AllowObjCConversionOnExplicit,
7913- bool AllowExplicit, bool AllowResultConversion) {
7919+ bool AllowExplicit, bool AllowResultConversion,
7920+ bool HasMatchedPackOnParmToNonPackOnArg) {
79147921 assert(!Conversion->getDescribedFunctionTemplate() &&
79157922 "Conversion function templates use AddTemplateConversionCandidate");
79167923 QualType ConvType = Conversion->getConversionType().getNonReferenceType();
@@ -7955,6 +7962,8 @@ void Sema::AddConversionCandidate(
79557962 Candidate.FinalConversion.setAllToTypes(ToType);
79567963 Candidate.Viable = true;
79577964 Candidate.ExplicitCallArguments = 1;
7965+ Candidate.HasMatchedPackOnParmToNonPackOnArg =
7966+ HasMatchedPackOnParmToNonPackOnArg;
79587967
79597968 // Explicit functions are not actually candidates at all if we're not
79607969 // allowing them in this context, but keep them around so we can point
@@ -8156,7 +8165,8 @@ void Sema::AddTemplateConversionCandidate(
81568165 assert(Specialization && "Missing function template specialization?");
81578166 AddConversionCandidate(Specialization, FoundDecl, ActingDC, From, ToType,
81588167 CandidateSet, AllowObjCConversionOnExplicit,
8159- AllowExplicit, AllowResultConversion);
8168+ AllowExplicit, AllowResultConversion,
8169+ Info.hasMatchedPackOnParmToNonPackOnArg());
81608170}
81618171
81628172void Sema::AddSurrogateCandidate(CXXConversionDecl *Conversion,
@@ -10509,6 +10519,10 @@ bool clang::isBetterOverloadCandidate(
1050910519 isa<CXXConstructorDecl>(Cand2.Function))
1051010520 return isa<CXXConstructorDecl>(Cand1.Function);
1051110521
10522+ if (Cand1.HasMatchedPackOnParmToNonPackOnArg !=
10523+ Cand2.HasMatchedPackOnParmToNonPackOnArg)
10524+ return Cand2.HasMatchedPackOnParmToNonPackOnArg;
10525+
1051210526 // -- F1 is a non-template function and F2 is a function template
1051310527 // specialization, or, if not that,
1051410528 bool Cand1IsSpecialization = Cand1.Function &&
0 commit comments