@@ -6864,7 +6864,8 @@ void Sema::AddOverloadCandidate(
6864
6864
OverloadCandidateSet &CandidateSet, bool SuppressUserConversions,
6865
6865
bool PartialOverloading, bool AllowExplicit, bool AllowExplicitConversions,
6866
6866
ADLCallKind IsADLCandidate, ConversionSequenceList EarlyConversions,
6867
- OverloadCandidateParamOrder PO, bool AggregateCandidateDeduction) {
6867
+ OverloadCandidateParamOrder PO, bool AggregateCandidateDeduction,
6868
+ bool HasMatchedPackOnParmToNonPackOnArg) {
6868
6869
const FunctionProtoType *Proto
6869
6870
= dyn_cast<FunctionProtoType>(Function->getType()->getAs<FunctionType>());
6870
6871
assert(Proto && "Functions without a prototype cannot be overloaded");
@@ -6883,7 +6884,8 @@ void Sema::AddOverloadCandidate(
6883
6884
AddMethodCandidate(Method, FoundDecl, Method->getParent(), QualType(),
6884
6885
Expr::Classification::makeSimpleLValue(), Args,
6885
6886
CandidateSet, SuppressUserConversions,
6886
- PartialOverloading, EarlyConversions, PO);
6887
+ PartialOverloading, EarlyConversions, PO,
6888
+ HasMatchedPackOnParmToNonPackOnArg);
6887
6889
return;
6888
6890
}
6889
6891
// We treat a constructor like a non-member function, since its object
@@ -6926,6 +6928,8 @@ void Sema::AddOverloadCandidate(
6926
6928
CandidateSet.getRewriteInfo().getRewriteKind(Function, PO);
6927
6929
Candidate.IsADLCandidate = IsADLCandidate;
6928
6930
Candidate.ExplicitCallArguments = Args.size();
6931
+ Candidate.HasMatchedPackOnParmToNonPackOnArg =
6932
+ HasMatchedPackOnParmToNonPackOnArg;
6929
6933
6930
6934
// Explicit functions are not actually candidates at all if we're not
6931
6935
// allowing them in this context, but keep them around so we can point
@@ -7453,16 +7457,13 @@ void Sema::AddMethodCandidate(DeclAccessPair FoundDecl, QualType ObjectType,
7453
7457
}
7454
7458
}
7455
7459
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) {
7466
7467
const FunctionProtoType *Proto
7467
7468
= dyn_cast<FunctionProtoType>(Method->getType()->getAs<FunctionType>());
7468
7469
assert(Proto && "Methods without a prototype cannot be overloaded");
@@ -7493,6 +7494,8 @@ Sema::AddMethodCandidate(CXXMethodDecl *Method, DeclAccessPair FoundDecl,
7493
7494
Candidate.TookAddressOfOverload =
7494
7495
CandidateSet.getKind() == OverloadCandidateSet::CSK_AddressOfOverloadSet;
7495
7496
Candidate.ExplicitCallArguments = Args.size();
7497
+ Candidate.HasMatchedPackOnParmToNonPackOnArg =
7498
+ HasMatchedPackOnParmToNonPackOnArg;
7496
7499
7497
7500
bool IgnoreExplicitObject =
7498
7501
(Method->isExplicitObjectMemberFunction() &&
@@ -7663,8 +7666,8 @@ void Sema::AddMethodTemplateCandidate(
7663
7666
ConversionSequenceList Conversions;
7664
7667
if (TemplateDeductionResult Result = DeduceTemplateArguments(
7665
7668
MethodTmpl, ExplicitTemplateArgs, Args, Specialization, Info,
7666
- PartialOverloading, /*AggregateDeductionCandidate=*/false, ObjectType,
7667
- ObjectClassification,
7669
+ PartialOverloading, /*AggregateDeductionCandidate=*/false,
7670
+ /*PartialOrdering=*/false, ObjectType, ObjectClassification,
7668
7671
[&](ArrayRef<QualType> ParamTypes) {
7669
7672
return CheckNonDependentConversions(
7670
7673
MethodTmpl, ParamTypes, Args, CandidateSet, Conversions,
@@ -7702,7 +7705,8 @@ void Sema::AddMethodTemplateCandidate(
7702
7705
AddMethodCandidate(cast<CXXMethodDecl>(Specialization), FoundDecl,
7703
7706
ActingContext, ObjectType, ObjectClassification, Args,
7704
7707
CandidateSet, SuppressUserConversions, PartialOverloading,
7705
- Conversions, PO);
7708
+ Conversions, PO,
7709
+ Info.hasMatchedPackOnParmToNonPackOnArg());
7706
7710
}
7707
7711
7708
7712
/// Determine whether a given function template has a simple explicit specifier
@@ -7748,6 +7752,7 @@ void Sema::AddTemplateOverloadCandidate(
7748
7752
if (TemplateDeductionResult Result = DeduceTemplateArguments(
7749
7753
FunctionTemplate, ExplicitTemplateArgs, Args, Specialization, Info,
7750
7754
PartialOverloading, AggregateCandidateDeduction,
7755
+ /*PartialOrdering=*/false,
7751
7756
/*ObjectType=*/QualType(),
7752
7757
/*ObjectClassification=*/Expr::Classification(),
7753
7758
[&](ArrayRef<QualType> ParamTypes) {
@@ -7788,7 +7793,8 @@ void Sema::AddTemplateOverloadCandidate(
7788
7793
Specialization, FoundDecl, Args, CandidateSet, SuppressUserConversions,
7789
7794
PartialOverloading, AllowExplicit,
7790
7795
/*AllowExplicitConversions=*/false, IsADLCandidate, Conversions, PO,
7791
- Info.AggregateDeductionCandidateHasMismatchedArity);
7796
+ Info.AggregateDeductionCandidateHasMismatchedArity,
7797
+ Info.hasMatchedPackOnParmToNonPackOnArg());
7792
7798
}
7793
7799
7794
7800
bool Sema::CheckNonDependentConversions(
@@ -7910,7 +7916,8 @@ void Sema::AddConversionCandidate(
7910
7916
CXXConversionDecl *Conversion, DeclAccessPair FoundDecl,
7911
7917
CXXRecordDecl *ActingContext, Expr *From, QualType ToType,
7912
7918
OverloadCandidateSet &CandidateSet, bool AllowObjCConversionOnExplicit,
7913
- bool AllowExplicit, bool AllowResultConversion) {
7919
+ bool AllowExplicit, bool AllowResultConversion,
7920
+ bool HasMatchedPackOnParmToNonPackOnArg) {
7914
7921
assert(!Conversion->getDescribedFunctionTemplate() &&
7915
7922
"Conversion function templates use AddTemplateConversionCandidate");
7916
7923
QualType ConvType = Conversion->getConversionType().getNonReferenceType();
@@ -7955,6 +7962,8 @@ void Sema::AddConversionCandidate(
7955
7962
Candidate.FinalConversion.setAllToTypes(ToType);
7956
7963
Candidate.Viable = true;
7957
7964
Candidate.ExplicitCallArguments = 1;
7965
+ Candidate.HasMatchedPackOnParmToNonPackOnArg =
7966
+ HasMatchedPackOnParmToNonPackOnArg;
7958
7967
7959
7968
// Explicit functions are not actually candidates at all if we're not
7960
7969
// allowing them in this context, but keep them around so we can point
@@ -8156,7 +8165,8 @@ void Sema::AddTemplateConversionCandidate(
8156
8165
assert(Specialization && "Missing function template specialization?");
8157
8166
AddConversionCandidate(Specialization, FoundDecl, ActingDC, From, ToType,
8158
8167
CandidateSet, AllowObjCConversionOnExplicit,
8159
- AllowExplicit, AllowResultConversion);
8168
+ AllowExplicit, AllowResultConversion,
8169
+ Info.hasMatchedPackOnParmToNonPackOnArg());
8160
8170
}
8161
8171
8162
8172
void Sema::AddSurrogateCandidate(CXXConversionDecl *Conversion,
@@ -10509,6 +10519,10 @@ bool clang::isBetterOverloadCandidate(
10509
10519
isa<CXXConstructorDecl>(Cand2.Function))
10510
10520
return isa<CXXConstructorDecl>(Cand1.Function);
10511
10521
10522
+ if (Cand1.HasMatchedPackOnParmToNonPackOnArg !=
10523
+ Cand2.HasMatchedPackOnParmToNonPackOnArg)
10524
+ return Cand2.HasMatchedPackOnParmToNonPackOnArg;
10525
+
10512
10526
// -- F1 is a non-template function and F2 is a function template
10513
10527
// specialization, or, if not that,
10514
10528
bool Cand1IsSpecialization = Cand1.Function &&
0 commit comments