@@ -6917,7 +6917,8 @@ void Sema::AddOverloadCandidate(
6917
6917
OverloadCandidateSet &CandidateSet, bool SuppressUserConversions,
6918
6918
bool PartialOverloading, bool AllowExplicit, bool AllowExplicitConversions,
6919
6919
ADLCallKind IsADLCandidate, ConversionSequenceList EarlyConversions,
6920
- OverloadCandidateParamOrder PO, bool AggregateCandidateDeduction) {
6920
+ OverloadCandidateParamOrder PO, bool AggregateCandidateDeduction,
6921
+ bool HasMatchedPackOnParmToNonPackOnArg) {
6921
6922
const FunctionProtoType *Proto
6922
6923
= dyn_cast<FunctionProtoType>(Function->getType()->getAs<FunctionType>());
6923
6924
assert(Proto && "Functions without a prototype cannot be overloaded");
@@ -6936,7 +6937,8 @@ void Sema::AddOverloadCandidate(
6936
6937
AddMethodCandidate(Method, FoundDecl, Method->getParent(), QualType(),
6937
6938
Expr::Classification::makeSimpleLValue(), Args,
6938
6939
CandidateSet, SuppressUserConversions,
6939
- PartialOverloading, EarlyConversions, PO);
6940
+ PartialOverloading, EarlyConversions, PO,
6941
+ HasMatchedPackOnParmToNonPackOnArg);
6940
6942
return;
6941
6943
}
6942
6944
// We treat a constructor like a non-member function, since its object
@@ -6979,6 +6981,8 @@ void Sema::AddOverloadCandidate(
6979
6981
CandidateSet.getRewriteInfo().getRewriteKind(Function, PO);
6980
6982
Candidate.IsADLCandidate = llvm::to_underlying(IsADLCandidate);
6981
6983
Candidate.ExplicitCallArguments = Args.size();
6984
+ Candidate.HasMatchedPackOnParmToNonPackOnArg =
6985
+ HasMatchedPackOnParmToNonPackOnArg;
6982
6986
6983
6987
// Explicit functions are not actually candidates at all if we're not
6984
6988
// allowing them in this context, but keep them around so we can point
@@ -7521,16 +7525,13 @@ void Sema::AddMethodCandidate(DeclAccessPair FoundDecl, QualType ObjectType,
7521
7525
}
7522
7526
}
7523
7527
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) {
7534
7535
const FunctionProtoType *Proto
7535
7536
= dyn_cast<FunctionProtoType>(Method->getType()->getAs<FunctionType>());
7536
7537
assert(Proto && "Methods without a prototype cannot be overloaded");
@@ -7561,6 +7562,8 @@ Sema::AddMethodCandidate(CXXMethodDecl *Method, DeclAccessPair FoundDecl,
7561
7562
Candidate.TookAddressOfOverload =
7562
7563
CandidateSet.getKind() == OverloadCandidateSet::CSK_AddressOfOverloadSet;
7563
7564
Candidate.ExplicitCallArguments = Args.size();
7565
+ Candidate.HasMatchedPackOnParmToNonPackOnArg =
7566
+ HasMatchedPackOnParmToNonPackOnArg;
7564
7567
7565
7568
bool IgnoreExplicitObject =
7566
7569
(Method->isExplicitObjectMemberFunction() &&
@@ -7731,8 +7734,8 @@ void Sema::AddMethodTemplateCandidate(
7731
7734
ConversionSequenceList Conversions;
7732
7735
if (TemplateDeductionResult Result = DeduceTemplateArguments(
7733
7736
MethodTmpl, ExplicitTemplateArgs, Args, Specialization, Info,
7734
- PartialOverloading, /*AggregateDeductionCandidate=*/false, ObjectType,
7735
- ObjectClassification,
7737
+ PartialOverloading, /*AggregateDeductionCandidate=*/false,
7738
+ /*PartialOrdering=*/false, ObjectType, ObjectClassification,
7736
7739
[&](ArrayRef<QualType> ParamTypes) {
7737
7740
return CheckNonDependentConversions(
7738
7741
MethodTmpl, ParamTypes, Args, CandidateSet, Conversions,
@@ -7770,7 +7773,8 @@ void Sema::AddMethodTemplateCandidate(
7770
7773
AddMethodCandidate(cast<CXXMethodDecl>(Specialization), FoundDecl,
7771
7774
ActingContext, ObjectType, ObjectClassification, Args,
7772
7775
CandidateSet, SuppressUserConversions, PartialOverloading,
7773
- Conversions, PO);
7776
+ Conversions, PO,
7777
+ Info.hasMatchedPackOnParmToNonPackOnArg());
7774
7778
}
7775
7779
7776
7780
/// Determine whether a given function template has a simple explicit specifier
@@ -7816,6 +7820,7 @@ void Sema::AddTemplateOverloadCandidate(
7816
7820
if (TemplateDeductionResult Result = DeduceTemplateArguments(
7817
7821
FunctionTemplate, ExplicitTemplateArgs, Args, Specialization, Info,
7818
7822
PartialOverloading, AggregateCandidateDeduction,
7823
+ /*PartialOrdering=*/false,
7819
7824
/*ObjectType=*/QualType(),
7820
7825
/*ObjectClassification=*/Expr::Classification(),
7821
7826
[&](ArrayRef<QualType> ParamTypes) {
@@ -7856,7 +7861,8 @@ void Sema::AddTemplateOverloadCandidate(
7856
7861
Specialization, FoundDecl, Args, CandidateSet, SuppressUserConversions,
7857
7862
PartialOverloading, AllowExplicit,
7858
7863
/*AllowExplicitConversions=*/false, IsADLCandidate, Conversions, PO,
7859
- Info.AggregateDeductionCandidateHasMismatchedArity);
7864
+ Info.AggregateDeductionCandidateHasMismatchedArity,
7865
+ Info.hasMatchedPackOnParmToNonPackOnArg());
7860
7866
}
7861
7867
7862
7868
bool Sema::CheckNonDependentConversions(
@@ -7978,7 +7984,8 @@ void Sema::AddConversionCandidate(
7978
7984
CXXConversionDecl *Conversion, DeclAccessPair FoundDecl,
7979
7985
CXXRecordDecl *ActingContext, Expr *From, QualType ToType,
7980
7986
OverloadCandidateSet &CandidateSet, bool AllowObjCConversionOnExplicit,
7981
- bool AllowExplicit, bool AllowResultConversion) {
7987
+ bool AllowExplicit, bool AllowResultConversion,
7988
+ bool HasMatchedPackOnParmToNonPackOnArg) {
7982
7989
assert(!Conversion->getDescribedFunctionTemplate() &&
7983
7990
"Conversion function templates use AddTemplateConversionCandidate");
7984
7991
QualType ConvType = Conversion->getConversionType().getNonReferenceType();
@@ -8023,6 +8030,8 @@ void Sema::AddConversionCandidate(
8023
8030
Candidate.FinalConversion.setAllToTypes(ToType);
8024
8031
Candidate.Viable = true;
8025
8032
Candidate.ExplicitCallArguments = 1;
8033
+ Candidate.HasMatchedPackOnParmToNonPackOnArg =
8034
+ HasMatchedPackOnParmToNonPackOnArg;
8026
8035
8027
8036
// Explicit functions are not actually candidates at all if we're not
8028
8037
// allowing them in this context, but keep them around so we can point
@@ -8224,7 +8233,8 @@ void Sema::AddTemplateConversionCandidate(
8224
8233
assert(Specialization && "Missing function template specialization?");
8225
8234
AddConversionCandidate(Specialization, FoundDecl, ActingDC, From, ToType,
8226
8235
CandidateSet, AllowObjCConversionOnExplicit,
8227
- AllowExplicit, AllowResultConversion);
8236
+ AllowExplicit, AllowResultConversion,
8237
+ Info.hasMatchedPackOnParmToNonPackOnArg());
8228
8238
}
8229
8239
8230
8240
void Sema::AddSurrogateCandidate(CXXConversionDecl *Conversion,
@@ -10576,6 +10586,10 @@ bool clang::isBetterOverloadCandidate(
10576
10586
isa<CXXConstructorDecl>(Cand2.Function))
10577
10587
return isa<CXXConstructorDecl>(Cand1.Function);
10578
10588
10589
+ if (Cand1.HasMatchedPackOnParmToNonPackOnArg !=
10590
+ Cand2.HasMatchedPackOnParmToNonPackOnArg)
10591
+ return Cand2.HasMatchedPackOnParmToNonPackOnArg;
10592
+
10579
10593
// -- F1 is a non-template function and F2 is a function template
10580
10594
// specialization, or, if not that,
10581
10595
bool Cand1IsSpecialization = Cand1.Function &&
0 commit comments