@@ -7700,18 +7700,6 @@ void Sema::AddMethodCandidate(
7700
7700
EnterExpressionEvaluationContext Unevaluated(
7701
7701
*this, Sema::ExpressionEvaluationContext::Unevaluated);
7702
7702
7703
- // Add this candidate
7704
- OverloadCandidate &Candidate =
7705
- CandidateSet.addCandidate(Args.size() + 1, EarlyConversions);
7706
- Candidate.FoundDecl = FoundDecl;
7707
- Candidate.Function = Method;
7708
- Candidate.RewriteKind =
7709
- CandidateSet.getRewriteInfo().getRewriteKind(Method, PO);
7710
- Candidate.TookAddressOfOverload =
7711
- CandidateSet.getKind() == OverloadCandidateSet::CSK_AddressOfOverloadSet;
7712
- Candidate.ExplicitCallArguments = Args.size();
7713
- Candidate.StrictPackMatch = StrictPackMatch;
7714
-
7715
7703
bool IgnoreExplicitObject =
7716
7704
(Method->isExplicitObjectMemberFunction() &&
7717
7705
CandidateSet.getKind() ==
@@ -7727,6 +7715,23 @@ void Sema::AddMethodCandidate(
7727
7715
unsigned NumParams = Method->getNumParams() - ExplicitOffset +
7728
7716
int(ImplicitObjectMethodTreatedAsStatic);
7729
7717
7718
+ unsigned ExtraArgs =
7719
+ CandidateSet.getKind() == OverloadCandidateSet::CSK_AddressOfOverloadSet
7720
+ ? 0
7721
+ : 1;
7722
+
7723
+ // Add this candidate
7724
+ OverloadCandidate &Candidate =
7725
+ CandidateSet.addCandidate(Args.size() + ExtraArgs, EarlyConversions);
7726
+ Candidate.FoundDecl = FoundDecl;
7727
+ Candidate.Function = Method;
7728
+ Candidate.RewriteKind =
7729
+ CandidateSet.getRewriteInfo().getRewriteKind(Method, PO);
7730
+ Candidate.TookAddressOfOverload =
7731
+ CandidateSet.getKind() == OverloadCandidateSet::CSK_AddressOfOverloadSet;
7732
+ Candidate.ExplicitCallArguments = Args.size();
7733
+ Candidate.StrictPackMatch = StrictPackMatch;
7734
+
7730
7735
// (C++ 13.3.2p2): A candidate function having fewer than m
7731
7736
// parameters is viable only if it has an ellipsis in its parameter
7732
7737
// list (8.3.5).
@@ -7757,7 +7762,9 @@ void Sema::AddMethodCandidate(
7757
7762
Candidate.Viable = true;
7758
7763
7759
7764
unsigned FirstConvIdx = PO == OverloadCandidateParamOrder::Reversed ? 1 : 0;
7760
- if (ObjectType.isNull())
7765
+ if (IgnoreExplicitObject)
7766
+ ;
7767
+ else if (ObjectType.isNull())
7761
7768
Candidate.IgnoreObjectArgument = true;
7762
7769
else if (Method->isStatic()) {
7763
7770
// [over.best.ics.general]p8
@@ -7807,7 +7814,7 @@ void Sema::AddMethodCandidate(
7807
7814
// arguments.
7808
7815
for (unsigned ArgIdx = 0; ArgIdx < Args.size(); ++ArgIdx) {
7809
7816
unsigned ConvIdx =
7810
- PO == OverloadCandidateParamOrder::Reversed ? 0 : (ArgIdx + 1 );
7817
+ PO == OverloadCandidateParamOrder::Reversed ? 0 : (ArgIdx + ExtraArgs );
7811
7818
if (Candidate.Conversions[ConvIdx].isInitialized()) {
7812
7819
// We already formed a conversion sequence for this parameter during
7813
7820
// template argument deduction.
@@ -7876,6 +7883,7 @@ static void AddMethodTemplateCandidateImmediately(
7876
7883
// function template are combined with the set of non-template candidate
7877
7884
// functions.
7878
7885
TemplateDeductionInfo Info(CandidateSet.getLocation());
7886
+ auto Method = cast<CXXMethodDecl>(MethodTmpl->getTemplatedDecl());
7879
7887
FunctionDecl *Specialization = nullptr;
7880
7888
ConversionSequenceList Conversions;
7881
7889
if (TemplateDeductionResult Result = S.DeduceTemplateArguments(
@@ -7897,14 +7905,18 @@ static void AddMethodTemplateCandidateImmediately(
7897
7905
OverloadCandidate &Candidate =
7898
7906
CandidateSet.addCandidate(Conversions.size(), Conversions);
7899
7907
Candidate.FoundDecl = FoundDecl;
7900
- Candidate.Function = MethodTmpl->getTemplatedDecl() ;
7908
+ Candidate.Function = Method ;
7901
7909
Candidate.Viable = false;
7902
7910
Candidate.RewriteKind =
7903
7911
CandidateSet.getRewriteInfo().getRewriteKind(Candidate.Function, PO);
7904
7912
Candidate.IsSurrogate = false;
7913
+ Candidate.TookAddressOfOverload =
7914
+ CandidateSet.getKind() ==
7915
+ OverloadCandidateSet::CSK_AddressOfOverloadSet;
7916
+
7905
7917
Candidate.IgnoreObjectArgument =
7906
- cast<CXXMethodDecl>(Candidate.Function) ->isStatic() ||
7907
- ObjectType.isNull();
7918
+ Method ->isStatic() ||
7919
+ (!Method->isExplicitObjectMemberFunction() && ObjectType.isNull() );
7908
7920
Candidate.ExplicitCallArguments = Args.size();
7909
7921
if (Result == TemplateDeductionResult::NonDependentConversionFailure)
7910
7922
Candidate.FailureKind = ovl_fail_bad_conversion;
@@ -8024,9 +8036,16 @@ static void AddTemplateOverloadCandidateImmediately(
8024
8036
Candidate.IsADLCandidate = llvm::to_underlying(IsADLCandidate);
8025
8037
// Ignore the object argument if there is one, since we don't have an object
8026
8038
// type.
8039
+ Candidate.TookAddressOfOverload =
8040
+ CandidateSet.getKind() ==
8041
+ OverloadCandidateSet::CSK_AddressOfOverloadSet;
8042
+
8027
8043
Candidate.IgnoreObjectArgument =
8028
8044
isa<CXXMethodDecl>(Candidate.Function) &&
8045
+ cast<CXXMethodDecl>(Candidate.Function)
8046
+ ->isImplicitObjectMemberFunction() &&
8029
8047
!isa<CXXConstructorDecl>(Candidate.Function);
8048
+
8030
8049
Candidate.ExplicitCallArguments = Args.size();
8031
8050
if (Result == TemplateDeductionResult::NonDependentConversionFailure)
8032
8051
Candidate.FailureKind = ovl_fail_bad_conversion;
@@ -8093,9 +8112,12 @@ bool Sema::CheckNonDependentConversions(
8093
8112
// that is correct.
8094
8113
const bool AllowExplicit = false;
8095
8114
8115
+ bool ForOverloadSetAddressResolution =
8116
+ CandidateSet.getKind() == OverloadCandidateSet::CSK_AddressOfOverloadSet;
8096
8117
auto *FD = FunctionTemplate->getTemplatedDecl();
8097
8118
auto *Method = dyn_cast<CXXMethodDecl>(FD);
8098
- bool HasThisConversion = Method && !isa<CXXConstructorDecl>(Method);
8119
+ bool HasThisConversion = !ForOverloadSetAddressResolution && Method &&
8120
+ !isa<CXXConstructorDecl>(Method);
8099
8121
unsigned ThisConversions = HasThisConversion ? 1 : 0;
8100
8122
8101
8123
if (Conversions.empty())
@@ -8165,7 +8187,8 @@ bool Sema::CheckNonDependentConversions(
8165
8187
};
8166
8188
8167
8189
unsigned Offset =
8168
- Method && Method->hasCXXExplicitFunctionObjectParameter() ? 1 : 0;
8190
+ HasThisConversion && Method->hasCXXExplicitFunctionObjectParameter() ? 1
8191
+ : 0;
8169
8192
8170
8193
for (unsigned I = 0, N = std::min(ParamTypes.size() - Offset, Args.size());
8171
8194
I != N; ++I) {
@@ -10780,7 +10803,8 @@ bool clang::isBetterOverloadCandidate(
10780
10803
// any function G, and, symmetrically, ICS1(G) is neither
10781
10804
// better nor worse than ICS1(F).
10782
10805
unsigned StartArg = 0;
10783
- if (Cand1.IgnoreObjectArgument || Cand2.IgnoreObjectArgument)
10806
+ if (!Cand1.TookAddressOfOverload &&
10807
+ (Cand1.IgnoreObjectArgument || Cand2.IgnoreObjectArgument))
10784
10808
StartArg = 1;
10785
10809
10786
10810
auto IsIllFormedConversion = [&](const ImplicitConversionSequence &ICS) {
@@ -11797,7 +11821,8 @@ static void DiagnoseBadConversion(Sema &S, OverloadCandidate *Cand,
11797
11821
// non-constructor method. Note that 'I' corresponds the
11798
11822
// conversion-slot index.
11799
11823
bool isObjectArgument = false;
11800
- if (isa<CXXMethodDecl>(Fn) && !isa<CXXConstructorDecl>(Fn)) {
11824
+ if (!TakingCandidateAddress && isa<CXXMethodDecl>(Fn) &&
11825
+ !isa<CXXConstructorDecl>(Fn)) {
11801
11826
if (I == 0)
11802
11827
isObjectArgument = true;
11803
11828
else if (!Fn->hasCXXExplicitFunctionObjectParameter())
@@ -12296,7 +12321,7 @@ static void DiagnoseBadDeduction(Sema &S, NamedDecl *Found, Decl *Templated,
12296
12321
}
12297
12322
case TemplateDeductionResult::TooManyArguments:
12298
12323
case TemplateDeductionResult::TooFewArguments:
12299
- DiagnoseArityMismatch(S, Found, Templated, NumArgs);
12324
+ DiagnoseArityMismatch(S, Found, Templated, NumArgs, TakingCandidateAddress );
12300
12325
return;
12301
12326
12302
12327
case TemplateDeductionResult::InstantiationDepth:
@@ -13073,8 +13098,10 @@ CompleteNonViableCandidate(Sema &S, OverloadCandidate *Cand,
13073
13098
13074
13099
// Attempt to fix the bad conversion.
13075
13100
unsigned ConvCount = Cand->Conversions.size();
13076
- for (unsigned ConvIdx = (Cand->IgnoreObjectArgument ? 1 : 0); /**/;
13077
- ++ConvIdx) {
13101
+ for (unsigned ConvIdx =
13102
+ ((!Cand->TookAddressOfOverload && Cand->IgnoreObjectArgument) ? 1
13103
+ : 0);
13104
+ /**/; ++ConvIdx) {
13078
13105
assert(ConvIdx != ConvCount && "no bad conversion in candidate");
13079
13106
if (Cand->Conversions[ConvIdx].isInitialized() &&
13080
13107
Cand->Conversions[ConvIdx].isBad()) {
@@ -13259,7 +13286,7 @@ void OverloadCandidateSet::NoteCandidates(Sema &S, ArrayRef<Expr *> Args,
13259
13286
13260
13287
if (Cand->Function)
13261
13288
NoteFunctionCandidate(S, Cand, Args.size(),
13262
- /*TakingCandidateAddress=*/false , DestAS);
13289
+ Kind == CSK_AddressOfOverloadSet , DestAS);
13263
13290
else if (Cand->IsSurrogate)
13264
13291
NoteSurrogateCandidate(S, Cand);
13265
13292
else {
0 commit comments