[clang] [Clang] Refactor uses of `Cand->Function` in SemaOverload.cpp (PR #98965)
via cfe-commits
cfe-commits at lists.llvm.org
Wed Jul 17 21:55:06 PDT 2024
https://github.com/vortex73 updated https://github.com/llvm/llvm-project/pull/98965
>From 60a51d9150fa3f31c3eab89e1f1da3b30d190b48 Mon Sep 17 00:00:00 2001
From: Vortex <nsreekumar6 at gmail.com>
Date: Tue, 16 Jul 2024 03:01:14 +0530
Subject: [PATCH 1/5] [Clang] Refactor uses of in SemaOverload.cpp
---
clang/lib/Sema/SemaOverload.cpp | 28 +++++++++++++++++-----------
1 file changed, 17 insertions(+), 11 deletions(-)
diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp
index 074062ebbb594..1275d311b21a8 100644
--- a/clang/lib/Sema/SemaOverload.cpp
+++ b/clang/lib/Sema/SemaOverload.cpp
@@ -46,6 +46,7 @@
#include "llvm/ADT/SmallVector.h"
#include "llvm/Support/Casting.h"
#include <algorithm>
+#include <cassert>
#include <cstddef>
#include <cstdlib>
#include <optional>
@@ -9994,8 +9995,9 @@ Sema::AddArgumentDependentLookupCandidates(DeclarationName Name,
CandEnd = CandidateSet.end();
Cand != CandEnd; ++Cand)
if (Cand->Function) {
- Fns.erase(Cand->Function);
- if (FunctionTemplateDecl *FunTmpl = Cand->Function->getPrimaryTemplate())
+ FunctionDecl *CandFunc = Cand->Function;
+ Fns.erase(CandFunc);
+ if (FunctionTemplateDecl *FunTmpl = CandFunc->getPrimaryTemplate())
Fns.erase(FunTmpl);
}
@@ -11349,8 +11351,7 @@ static void DiagnoseBadConversion(Sema &S, OverloadCandidate *Cand,
}
}
- if (TakingCandidateAddress &&
- !checkAddressOfCandidateIsAvailable(S, Cand->Function))
+ if (TakingCandidateAddress && !checkAddressOfCandidateIsAvailable(S, Fn))
return;
// Emit the generic diagnostic and, optionally, add the hints to it.
@@ -11376,6 +11377,7 @@ static void DiagnoseBadConversion(Sema &S, OverloadCandidate *Cand,
/// over a candidate in any candidate set.
static bool CheckArityMismatch(Sema &S, OverloadCandidate *Cand,
unsigned NumArgs, bool IsAddressOf = false) {
+ assert(Cand->Function && "Candidate is required to be a function.");
FunctionDecl *Fn = Cand->Function;
unsigned MinParams = Fn->getMinRequiredExplicitArguments() +
((IsAddressOf && !Fn->isStatic()) ? 1 : 0);
@@ -11780,6 +11782,7 @@ static void DiagnoseBadDeduction(Sema &S, OverloadCandidate *Cand,
/// CUDA: diagnose an invalid call across targets.
static void DiagnoseBadTarget(Sema &S, OverloadCandidate *Cand) {
FunctionDecl *Caller = S.getCurFunctionDecl(/*AllowLambda=*/true);
+ assert(Cand->Function && "Candidate must be a Function.");
FunctionDecl *Callee = Cand->Function;
CUDAFunctionTarget CallerTarget = S.CUDA().IdentifyTarget(Caller),
@@ -11837,6 +11840,7 @@ static void DiagnoseBadTarget(Sema &S, OverloadCandidate *Cand) {
}
static void DiagnoseFailedEnableIfAttr(Sema &S, OverloadCandidate *Cand) {
+ assert(Cand->Function && "Candidate must be a function");
FunctionDecl *Callee = Cand->Function;
EnableIfAttr *Attr = static_cast<EnableIfAttr*>(Cand->DeductionFailure.Data);
@@ -11846,11 +11850,13 @@ static void DiagnoseFailedEnableIfAttr(Sema &S, OverloadCandidate *Cand) {
}
static void DiagnoseFailedExplicitSpec(Sema &S, OverloadCandidate *Cand) {
- ExplicitSpecifier ES = ExplicitSpecifier::getFromDecl(Cand->Function);
+ assert(Cand->Function && "Candidate must be a function");
+ Function *CandFunc = Cand->Function;
+ ExplicitSpecifier ES = ExplicitSpecifier::getFromDecl(CandFunc);
assert(ES.isExplicit() && "not an explicit candidate");
unsigned Kind;
- switch (Cand->Function->getDeclKind()) {
+ switch (CandFunc->getDeclKind()) {
case Decl::Kind::CXXConstructor:
Kind = 0;
break;
@@ -11858,7 +11864,7 @@ static void DiagnoseFailedExplicitSpec(Sema &S, OverloadCandidate *Cand) {
Kind = 1;
break;
case Decl::Kind::CXXDeductionGuide:
- Kind = Cand->Function->isImplicit() ? 0 : 2;
+ Kind = CandFunc->isImplicit() ? 0 : 2;
break;
default:
llvm_unreachable("invalid Decl");
@@ -11868,7 +11874,7 @@ static void DiagnoseFailedExplicitSpec(Sema &S, OverloadCandidate *Cand) {
// (particularly an out-of-class definition) will typically lack the
// 'explicit' specifier.
// FIXME: This is probably a good thing to do for all 'candidate' notes.
- FunctionDecl *First = Cand->Function->getFirstDecl();
+ FunctionDecl *First = CandFunc->getFirstDecl();
if (FunctionDecl *Pattern = First->getTemplateInstantiationPattern())
First = Pattern->getFirstDecl();
@@ -11937,6 +11943,7 @@ static void NoteFunctionCandidate(Sema &S, OverloadCandidate *Cand,
unsigned NumArgs,
bool TakingCandidateAddress,
LangAS CtorDestAS = LangAS::Default) {
+ assert(Cand->Function && "Candidate must be a function");
FunctionDecl *Fn = Cand->Function;
if (shouldSkipNotingLambdaConversionDecl(Fn))
return;
@@ -11951,8 +11958,7 @@ static void NoteFunctionCandidate(Sema &S, OverloadCandidate *Cand,
// Skip implicit member functions when trying to resolve
// the address of a an overload set for a function pointer.
if (Cand->TookAddressOfOverload &&
- !Cand->Function->hasCXXExplicitFunctionObjectParameter() &&
- !Cand->Function->isStatic())
+ !Fn->hasCXXExplicitFunctionObjectParameter() && !Fn->isStatic())
return;
// Note deleted candidates, but only if they're viable.
@@ -12050,7 +12056,7 @@ static void NoteFunctionCandidate(Sema &S, OverloadCandidate *Cand,
return;
case ovl_fail_addr_not_available: {
- bool Available = checkAddressOfCandidateIsAvailable(S, Cand->Function);
+ bool Available = checkAddressOfCandidateIsAvailable(S, Fn);
(void)Available;
assert(!Available);
break;
>From 8a4cea6d6237e242c6c11a36b2124a955a7939d7 Mon Sep 17 00:00:00 2001
From: Vortex <nsreekumar6 at gmail.com>
Date: Tue, 16 Jul 2024 03:01:14 +0530
Subject: [PATCH 2/5] [Clang] Refactor uses of Cand->Function in
SemaOverload.cpp
---
clang/lib/Sema/SemaOverload.cpp | 28 +++++++++++++++++-----------
1 file changed, 17 insertions(+), 11 deletions(-)
diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp
index 074062ebbb594..1275d311b21a8 100644
--- a/clang/lib/Sema/SemaOverload.cpp
+++ b/clang/lib/Sema/SemaOverload.cpp
@@ -46,6 +46,7 @@
#include "llvm/ADT/SmallVector.h"
#include "llvm/Support/Casting.h"
#include <algorithm>
+#include <cassert>
#include <cstddef>
#include <cstdlib>
#include <optional>
@@ -9994,8 +9995,9 @@ Sema::AddArgumentDependentLookupCandidates(DeclarationName Name,
CandEnd = CandidateSet.end();
Cand != CandEnd; ++Cand)
if (Cand->Function) {
- Fns.erase(Cand->Function);
- if (FunctionTemplateDecl *FunTmpl = Cand->Function->getPrimaryTemplate())
+ FunctionDecl *CandFunc = Cand->Function;
+ Fns.erase(CandFunc);
+ if (FunctionTemplateDecl *FunTmpl = CandFunc->getPrimaryTemplate())
Fns.erase(FunTmpl);
}
@@ -11349,8 +11351,7 @@ static void DiagnoseBadConversion(Sema &S, OverloadCandidate *Cand,
}
}
- if (TakingCandidateAddress &&
- !checkAddressOfCandidateIsAvailable(S, Cand->Function))
+ if (TakingCandidateAddress && !checkAddressOfCandidateIsAvailable(S, Fn))
return;
// Emit the generic diagnostic and, optionally, add the hints to it.
@@ -11376,6 +11377,7 @@ static void DiagnoseBadConversion(Sema &S, OverloadCandidate *Cand,
/// over a candidate in any candidate set.
static bool CheckArityMismatch(Sema &S, OverloadCandidate *Cand,
unsigned NumArgs, bool IsAddressOf = false) {
+ assert(Cand->Function && "Candidate is required to be a function.");
FunctionDecl *Fn = Cand->Function;
unsigned MinParams = Fn->getMinRequiredExplicitArguments() +
((IsAddressOf && !Fn->isStatic()) ? 1 : 0);
@@ -11780,6 +11782,7 @@ static void DiagnoseBadDeduction(Sema &S, OverloadCandidate *Cand,
/// CUDA: diagnose an invalid call across targets.
static void DiagnoseBadTarget(Sema &S, OverloadCandidate *Cand) {
FunctionDecl *Caller = S.getCurFunctionDecl(/*AllowLambda=*/true);
+ assert(Cand->Function && "Candidate must be a Function.");
FunctionDecl *Callee = Cand->Function;
CUDAFunctionTarget CallerTarget = S.CUDA().IdentifyTarget(Caller),
@@ -11837,6 +11840,7 @@ static void DiagnoseBadTarget(Sema &S, OverloadCandidate *Cand) {
}
static void DiagnoseFailedEnableIfAttr(Sema &S, OverloadCandidate *Cand) {
+ assert(Cand->Function && "Candidate must be a function");
FunctionDecl *Callee = Cand->Function;
EnableIfAttr *Attr = static_cast<EnableIfAttr*>(Cand->DeductionFailure.Data);
@@ -11846,11 +11850,13 @@ static void DiagnoseFailedEnableIfAttr(Sema &S, OverloadCandidate *Cand) {
}
static void DiagnoseFailedExplicitSpec(Sema &S, OverloadCandidate *Cand) {
- ExplicitSpecifier ES = ExplicitSpecifier::getFromDecl(Cand->Function);
+ assert(Cand->Function && "Candidate must be a function");
+ Function *CandFunc = Cand->Function;
+ ExplicitSpecifier ES = ExplicitSpecifier::getFromDecl(CandFunc);
assert(ES.isExplicit() && "not an explicit candidate");
unsigned Kind;
- switch (Cand->Function->getDeclKind()) {
+ switch (CandFunc->getDeclKind()) {
case Decl::Kind::CXXConstructor:
Kind = 0;
break;
@@ -11858,7 +11864,7 @@ static void DiagnoseFailedExplicitSpec(Sema &S, OverloadCandidate *Cand) {
Kind = 1;
break;
case Decl::Kind::CXXDeductionGuide:
- Kind = Cand->Function->isImplicit() ? 0 : 2;
+ Kind = CandFunc->isImplicit() ? 0 : 2;
break;
default:
llvm_unreachable("invalid Decl");
@@ -11868,7 +11874,7 @@ static void DiagnoseFailedExplicitSpec(Sema &S, OverloadCandidate *Cand) {
// (particularly an out-of-class definition) will typically lack the
// 'explicit' specifier.
// FIXME: This is probably a good thing to do for all 'candidate' notes.
- FunctionDecl *First = Cand->Function->getFirstDecl();
+ FunctionDecl *First = CandFunc->getFirstDecl();
if (FunctionDecl *Pattern = First->getTemplateInstantiationPattern())
First = Pattern->getFirstDecl();
@@ -11937,6 +11943,7 @@ static void NoteFunctionCandidate(Sema &S, OverloadCandidate *Cand,
unsigned NumArgs,
bool TakingCandidateAddress,
LangAS CtorDestAS = LangAS::Default) {
+ assert(Cand->Function && "Candidate must be a function");
FunctionDecl *Fn = Cand->Function;
if (shouldSkipNotingLambdaConversionDecl(Fn))
return;
@@ -11951,8 +11958,7 @@ static void NoteFunctionCandidate(Sema &S, OverloadCandidate *Cand,
// Skip implicit member functions when trying to resolve
// the address of a an overload set for a function pointer.
if (Cand->TookAddressOfOverload &&
- !Cand->Function->hasCXXExplicitFunctionObjectParameter() &&
- !Cand->Function->isStatic())
+ !Fn->hasCXXExplicitFunctionObjectParameter() && !Fn->isStatic())
return;
// Note deleted candidates, but only if they're viable.
@@ -12050,7 +12056,7 @@ static void NoteFunctionCandidate(Sema &S, OverloadCandidate *Cand,
return;
case ovl_fail_addr_not_available: {
- bool Available = checkAddressOfCandidateIsAvailable(S, Cand->Function);
+ bool Available = checkAddressOfCandidateIsAvailable(S, Fn);
(void)Available;
assert(!Available);
break;
>From d48e7d3b6242e6ce65fd5f5e9651e0995751db77 Mon Sep 17 00:00:00 2001
From: Vortex <nsreekumar6 at gmail.com>
Date: Tue, 16 Jul 2024 03:12:36 +0530
Subject: [PATCH 3/5] [Clang] Refactor uses of Cand->Function in
SemaOverload.cpp
---
clang/lib/Sema/SemaOverload.cpp | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp
index 1275d311b21a8..b68e54b9caa5b 100644
--- a/clang/lib/Sema/SemaOverload.cpp
+++ b/clang/lib/Sema/SemaOverload.cpp
@@ -11468,8 +11468,10 @@ static void DiagnoseArityMismatch(Sema &S, NamedDecl *Found, Decl *D,
/// Arity mismatch diagnosis specific to a function overload candidate.
static void DiagnoseArityMismatch(Sema &S, OverloadCandidate *Cand,
unsigned NumFormalArgs) {
+ assert(Cand->Function && "Candidate must be a function");
+ FunctionDecl *Fn = Cand->Function;
if (!CheckArityMismatch(S, Cand, NumFormalArgs, Cand->TookAddressOfOverload))
- DiagnoseArityMismatch(S, Cand->FoundDecl, Cand->Function, NumFormalArgs,
+ DiagnoseArityMismatch(S, Cand->FoundDecl, Fn, NumFormalArgs,
Cand->TookAddressOfOverload);
}
@@ -11769,13 +11771,15 @@ static void DiagnoseBadDeduction(Sema &S, NamedDecl *Found, Decl *Templated,
static void DiagnoseBadDeduction(Sema &S, OverloadCandidate *Cand,
unsigned NumArgs,
bool TakingCandidateAddress) {
+ assert(Cand->Function && "Candidate must be a function");
+ FunctionDecl *Fn = Cand->Function;
TemplateDeductionResult TDK = Cand->DeductionFailure.getResult();
if (TDK == TemplateDeductionResult::TooFewArguments ||
TDK == TemplateDeductionResult::TooManyArguments) {
if (CheckArityMismatch(S, Cand, NumArgs))
return;
}
- DiagnoseBadDeduction(S, Cand->FoundDecl, Cand->Function, // pattern
+ DiagnoseBadDeduction(S, Cand->FoundDecl, Fn, // pattern
Cand->DeductionFailure, NumArgs, TakingCandidateAddress);
}
>From 5e0c33cbea49a8b7fd2e833b3c1431efa470a55d Mon Sep 17 00:00:00 2001
From: Vortex <nsreekumar6 at gmail.com>
Date: Thu, 18 Jul 2024 10:09:03 +0530
Subject: [PATCH 4/5] renamed occurences of CandFunc to Fn
---
clang/lib/Sema/SemaOverload.cpp | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)
diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp
index b68e54b9caa5b..bc1dd862d4058 100644
--- a/clang/lib/Sema/SemaOverload.cpp
+++ b/clang/lib/Sema/SemaOverload.cpp
@@ -9995,9 +9995,9 @@ Sema::AddArgumentDependentLookupCandidates(DeclarationName Name,
CandEnd = CandidateSet.end();
Cand != CandEnd; ++Cand)
if (Cand->Function) {
- FunctionDecl *CandFunc = Cand->Function;
- Fns.erase(CandFunc);
- if (FunctionTemplateDecl *FunTmpl = CandFunc->getPrimaryTemplate())
+ FunctionDecl *Fn = Cand->Function;
+ Fns.erase(Fn);
+ if (FunctionTemplateDecl *FunTmpl = Fn->getPrimaryTemplate())
Fns.erase(FunTmpl);
}
@@ -11855,12 +11855,12 @@ static void DiagnoseFailedEnableIfAttr(Sema &S, OverloadCandidate *Cand) {
static void DiagnoseFailedExplicitSpec(Sema &S, OverloadCandidate *Cand) {
assert(Cand->Function && "Candidate must be a function");
- Function *CandFunc = Cand->Function;
- ExplicitSpecifier ES = ExplicitSpecifier::getFromDecl(CandFunc);
+ Function *Fn = Cand->Function;
+ ExplicitSpecifier ES = ExplicitSpecifier::getFromDecl(Fn);
assert(ES.isExplicit() && "not an explicit candidate");
unsigned Kind;
- switch (CandFunc->getDeclKind()) {
+ switch (Fn->getDeclKind()) {
case Decl::Kind::CXXConstructor:
Kind = 0;
break;
@@ -11868,7 +11868,7 @@ static void DiagnoseFailedExplicitSpec(Sema &S, OverloadCandidate *Cand) {
Kind = 1;
break;
case Decl::Kind::CXXDeductionGuide:
- Kind = CandFunc->isImplicit() ? 0 : 2;
+ Kind = Fn->isImplicit() ? 0 : 2;
break;
default:
llvm_unreachable("invalid Decl");
@@ -11878,7 +11878,7 @@ static void DiagnoseFailedExplicitSpec(Sema &S, OverloadCandidate *Cand) {
// (particularly an out-of-class definition) will typically lack the
// 'explicit' specifier.
// FIXME: This is probably a good thing to do for all 'candidate' notes.
- FunctionDecl *First = CandFunc->getFirstDecl();
+ FunctionDecl *First = Fn->getFirstDecl();
if (FunctionDecl *Pattern = First->getTemplateInstantiationPattern())
First = Pattern->getFirstDecl();
>From ef007ca0c0119298767bbc9f1a345969fe6e8c03 Mon Sep 17 00:00:00 2001
From: Vortex <nsreekumar6 at gmail.com>
Date: Thu, 18 Jul 2024 10:09:03 +0530
Subject: [PATCH 5/5] renamed occurences of CandFunc to Fn
---
clang/lib/Sema/SemaOverload.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp
index bc1dd862d4058..5712ab0377f72 100644
--- a/clang/lib/Sema/SemaOverload.cpp
+++ b/clang/lib/Sema/SemaOverload.cpp
@@ -11855,7 +11855,7 @@ static void DiagnoseFailedEnableIfAttr(Sema &S, OverloadCandidate *Cand) {
static void DiagnoseFailedExplicitSpec(Sema &S, OverloadCandidate *Cand) {
assert(Cand->Function && "Candidate must be a function");
- Function *Fn = Cand->Function;
+ FunctionDecl *Fn = Cand->Function;
ExplicitSpecifier ES = ExplicitSpecifier::getFromDecl(Fn);
assert(ES.isExplicit() && "not an explicit candidate");
More information about the cfe-commits
mailing list